当前位置: 首页 > 面试题库 >

停止在主线程上运行的DispatchQueue

谭京
2023-03-14
问题内容

我有这段代码:

    DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(isDelayAccounted.hashValue)) + extraDelay) {
        self.isShootingOnHold = false
        self.shoot()
        self.shootingEngine = Timer.scheduledTimer(timeInterval: (Double(60)/Double(self.ratePerMinute)), target: self, selector: #selector(ShootingEnemy.shoot), userInfo: nil, repeats: true)   
    }

现在,我希望能够停止执行该线程。如何阻止它执行?例如,三秒钟后,我决定不再执行该命令,因此我想停止它。


问题答案:

您可以使用DispatchWorkItems。它们可以在DispatchQueues 上安排,并在执行前取消。

let work = DispatchWorkItem(block: {
    self.isShootingOnHold = false
    self.shoot()
    self.shootingEngine = Timer.scheduledTimer(timeInterval: (Double(60)/Double(self.ratePerMinute)), target: self, selector: #selector(ShootingEnemy.shoot), userInfo: nil, repeats: true)
})
DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(isDelayAccounted.hashValue)) + extraDelay, execute: work)
work.cancel()


 类似资料:
  • 我的代码中有一个中断点,用来挂起所有的线程,但是为了测试一个bug,我想同时在该断点运行所有停止的线程,但是我无法找到它。我只能1乘1恢复线程,这对我的测试来说太慢了,有什么帮助吗?

  • 问题内容: 我读了这句话: 主线程必须是完成执行的最后一个线程。当主线程停止时,程序终止。 是真的吗 我也知道“即使主线程死程序继续运行”。 据我了解:启动程序时,JVM创建一个线程来运行您的程序。JVM创建一个用于运行程序的用户线程。该线程称为主线程。该类的main方法是从主线程调用的。如果程序从主线程中产生新线程,它将停止直到最后一个线程死亡。 哪一个是对的? 问题答案: 当所有非守护程序线程

  • 问题内容: 这是一个普遍的Java问题,而不是Android的第一个问题! 我想从二级线程的上下文中了解如何在主线程上运行代码。例如: 这类事情-我意识到我的示例有点差,因为在Java中,您不需要进入主线程即可打印出某些内容,并且Swing也具有事件队列- 但在一般情况下,您可能需要在后台线程的上下文中,在主线程上运行Runnable。 编辑:为了进行比较-这是我在Objective-C中的做法:

  • 我需要做的是能够停止从一个实现runnable的线程类运行的所有线程。这就是我的意思:这里是我的“线程”类的开始: 这就是我如何创建多个线程来执行此操作: m是要创建的线程数。这可能是从50到1000的任何地方。现在我需要做的是突然立刻停止所有的动作。我该怎么做呢?

  • 我尝试使用ImageJ库来处理图像。我的问题是,有些线程从未停止过。Eclipse总是向我显示一个正在运行的活动线程。如果我向下面的函数传递一个大于0的值,就会发生这种情况。似乎只要ImageJ有要处理的东西,它就会在内部打开一个线程(例如,blurGaussian(0.1)。 我怎么才能阻止这条线? 我的代码: 使用的库:https://mvnrepository.com/artifact/ne

  • 问题内容: 如果我有这样的Java代码: 并在调试中运行它,我可以看到所有这些线程(在取消之后)仍在运行,所以它们也占用了我的内存吗?如果是的话,我怎么能完全销毁那些线程? 问题答案: 调用您的线程,仅此而已。因此,您需要在您的方法中正确处理它。对于您的简单情况,您的线程将完成其执行,并且它们的对象将由GC清除。