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

时间:2015-08-07 07:27:15

标签: java multithreading

您必须从两台计算机驱动器中找到一个文件。如果一个线程首先找到它,那么第二个线程将停止。

3 个答案:

答案 0 :(得分:1)

让所有线程定期检查一个标志变量,看它是否已经设置,然后停止搜索是否有。您可以在每个文件之后,每个目录之后,或者自上次检查后超过一秒钟时检查,根据您的需要,机制由您决定。

如果找到该文件,那么只需要一个 set 的标志。其他线程很快就会接收并停止。

我更喜欢让每个线程负责自己的资源,包括它的生命周期,这就是为什么我更喜欢这种解决方案来尝试从外部杀死一个线程。

知道 Java是否遇到与pthreads相同的问题(在破坏拥有关键资源的线程方面)但我宁愿安全而不是抱歉。

答案 1 :(得分:1)

首先,你不能强制线程在java中停止。为了安全地停止thrad,它必须自然地终止"#34;。 (意思是,必须执行内部的所有代码或发生不是警告的异常)。

在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) {
 }

所以easiet实现是让你的两个线程互相引用,如果一个线程找到了它在另一个线程上调用中断的文件,由于上面的while循环,它会终止。

有关更多信息,请参阅实践中的Java Concurrency。

答案 2 :(得分:0)

您可以尝试使用标记是否找到该文件。如果标志改变其状态,线程将退出。

实施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;
            }
        }
    }
}