[英]How to stop a thread if one thread has completed a task first?
您必须从两个计算机驱动器中找到一个文件。 如果一个线程首先找到它,那么第二个线程将停止。
让所有线程定期检查一个标志变量以查看它是否已设置,然后停止搜索是否有。 您可以在每个文件之后,每个目录之后,或者自上次检查后超过一秒钟时检查,根据您的需要,机制由您决定。
然后只有一个线程设置该标志,如果它找到该文件。 其他线程很快就会接收并停止。
我更喜欢让每个线程负责自己的资源, 包括它的生命周期,这就是为什么我更喜欢这种解决方案来尝试从外部杀死一个线程。
我不知道 Java是否遇到与pthreads相同的问题(在销毁拥有关键资源的线程方面),但我宁愿安全而不是抱歉。
首先,你不能强制线程在java中停止。 为了安全地停止thrad,它必须“自然地”终止。 (意思是,必须执行内部的所有代码或发生不是警告的异常)。
在Java中,您可以使用“中断”标志。 让两个线程检查Thread.currentThread()。isInterrupted(),如下所示:
try {
while(!Thread.currentThread().isInterrupted()) {
[...]
Thread.sleep(); //May be you need to sleep here for a short period to not produce to much load on your system, ?
}
} catch (InterruptedException consumed) {
}
所以easyiet的实现是让你的两个线程互相引用,如果一个线程找到了它在另一个线程上调用的文件,那么由于上面的while循环而终止了。
有关更多信息,请参阅实践中的Java Concurrency。
无论文件是否找到,您都可以尝试使用标记。 如果标志更改其状态,则线程将退出。
实现Runnable的示例
public class Finder implements Runnable {
private static boolean found = false;
@Override
public void run() {
for (ITERATE_THROUG_FILES) {
if (found) {
break;
}
if (FILE == SEARCHED_FILE) {
found = true;
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.