java - 线程中断

标签 java multithreading

所以我有一个关于java中线程的interrupt()方法的问题。这是我的一段代码:

threads.forEach(Thread::start);
threads.forEach(thread -> {
    try {
        thread.join();
        if (done){
            thread.interrupt();
        }
    } catch (InterruptedException e){
        e.printStackTrace();
    }
});

现在,如您所见,我首先启动每个线程并加入它们。我想知道的是“thread.interrupt()”是否按照我的想法进行。我创建了一个 volatile boolean 值“done”(默认情况下为 false)。我在某处还有另一段代码,每个线程在文件中搜索某些内容。当发现某些东西时,我将 boolean 值“done”设置为“true”。我希望这会阻止所有其他尚未完成的线程运行。

但是,有些事情告诉我,这并不像我想象的那么容易。因此,如果有人能告诉我我所做的是否正确 - 如果不正确 - 这到底是做什么的,我将不胜感激。

最佳答案

What I want to know is if "thread.interrupt()" does what I think it does.

不,事实并非如此。

假设您有两个线程在文件中搜索某些内容。当 thread2 发现该东西是什么,并将 done 设置为 true 时,主线程(您问题中的代码)可能仍在等待 thread1 终止,因为您在 thread1 上调用了 thread.join();,而 threads.forEach 并不并行运行。

主线程将阻塞在thread1.join()上,直到thread1也发现了这个事情,或者在没有找到任何东西的情况下完成,或者被第三个线程中断。

要实现您的预​​期目的,您必须为您创建的每个线程维护所有其他线程的引用,并在任何一个线程第一次发现结果时中断所有其他线程。

另一种方法是不为每个线程调用 join,而是忙于检查 volatile 标志 done,并在 done == true 时中断每个线程。

threads.forEach(Thread::start);
while (!done) {
    Thread.sleep(100);
}
threads.forEach(thread -> {
    try {
        thread.interrupt();
    } catch (InterruptedException e){
        e.printStackTrace();
    }
});

关于java - 线程中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60868849/

相关文章:

java - 从存储库解析插件 'spring:boot' 的版本时出错

c# - 任务工作项优先级

java - 线程通知不起作用

java - 使该类线程安全

C# vs Java - 为什么需要 virtual 关键字?

java - 我有一个日期列表,我想在 pja 查询中成对使用 then ,直到所有日期都在 java 中使用结束

Java BufferedReader 在第一次迭代时总是抛出 NumberFormatException

c - 当循环迭代不独立时使用 OpenMP 并行化循环

java - 如何更改线程执行顺序,使最后创建的线程先运行?

java - 如果找到的值超过最大值,则使用 DocumentFilter 自动设置为最大值的 JTextField