1

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

我想停止它,因为线程将下载图像,如果我不停止它并再次调用它,新图像将需要很长时间才能下载。有可能这样做吗?

4

2 回答 2

2

根据我的经验,通常最好让线程自己优雅地退出。如果出现问题,让主线程可以设置为 false 的一些公共变量怎么样。第二个线程可以定期检查这个变量,如果它被设置为假,它知道它应该清理并返回。

我认为您可以以更优雅的方式使用条件变量,但他正确使用 NSLock 的方法应该有效。

于 2010-01-15T06:10:41.367 回答
1

NSThread 实现了一种方法,该方法-(void)cancel在接收线程中设置状态信息以指示它应该退出。接收后台线程应该(如果行为正常)定期检查它是否被取消使用-(BOOL)isCancelled

这样,接收者就有机会以适当的方式清理其获得的资源。

查看 Java 语言线程语义,该设备的工作方式完全相同。Javas Thread 实现了两种方法void Thread.interrupt()boolean Thread.isInterrupted().

如果长时间运行的后台操作对尝试-cancel它们没有反应,我会认为这是一个严重的问题并提交错误报告/更改请求。

-(BOOL)isFinished您可以通过定期调用或者-(BOOL)isExecuting在后台等待后台线程的终止NSThread。不幸的NSDidBecomeSingleThreadedNotification是,iPhone 平台不支持。

于 2010-01-15T06:32:00.433 回答