繁体   English   中英

如果一个线程先完成一个任务,如何停止线程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM