如何从Iphone NSthread中的主线程中停止后台线程?

时间:2010-01-15 06:04:36

标签: iphone nsthread

当我的主线程正在检查某些内容时,我从我的程序中启动了一个后台线程。如果检查结果为false,我想停止正在运行的后台线程并使用我的新参数重新启动它。

我想要停止它,因为线程将下载图像,如果我没有停止并再次调用它,则需要花费大量时间来下载新图像。是否可以这样做?

2 个答案:

答案 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)isExecutingNSThread来等待后台线程终止。不幸的是,iPhone平台不支持NSDidBecomeSingleThreadedNotification