当我的主线程正在检查某些内容时,我从我的程序中启动了一个后台线程。如果检查结果为false,我想停止正在运行的后台线程并使用我的新参数重新启动它。
我想要停止它,因为线程将下载图像,如果我没有停止并再次调用它,则需要花费大量时间来下载新图像。是否可以这样做?
答案 0 :(得分:2)
根据我的经验,通常最好让线程自己优雅地退出。如果出现问题,主线程可以设置为false的公共变量怎么样?第二个线程可以定期检查这个变量,如果它已经设置为false,它知道它应该清理并返回。
我认为你可以以更优雅的方式使用条件变量,但他正确使用NSLock的方法应该有效。
答案 1 :(得分:1)
NSThread实现了一个方法-(void)cancel
,它在接收线程中设置状态信息以指示它应该退出。接收后台线程应该 - 如果行为正常 - 定期检查是否使用-(BOOL)isCancelled
取消它。
这样接收者就有机会以适当的方式清理它获得的资源。
查看Java语言线程语义,该设备的工作方式完全相同。 Javas Thread实现了两种方法void Thread.interrupt()
和boolean Thread.isInterrupted()
。
如果长时间运行的后台操作没有对-cancel
他们的尝试做出反应,我会认为这是一个严重的问题,并提交错误报告/更改请求。
您可以通过在后台-(BOOL)isFinished
定期调用-(BOOL)isExecuting
或NSThread
来等待后台线程终止。不幸的是,iPhone平台不支持NSDidBecomeSingleThreadedNotification
。