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