【问题标题】:Thread interruption线程中断
【发布时间】:2020-04-07 21:37:09
【问题描述】:

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

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

现在,如您所见,我首先启动每个线程并加入它们。我想知道的是“thread.interrupt()”是否像我认为的那样做。我创建了一个不稳定的布尔“完成”(默认情况下为假)。我在某处还有另一段代码,每个线程都在其中搜索文件中的内容。当找到那个东西时,我将布尔值设置为 true。我希望这可以阻止所有其他尚未完成的线程运行。

但是,有件事告诉我,这并不像我做的那么容易。因此,如果有人能告诉我我所做的是否正确(如果不是),我将不胜感激。

【问题讨论】:

  • 你启动的线程必须自己处理中断。你没有提供实现,所以我们不知道。
  • 'thread.join()' 将等待线程从其 run() 方法返回。之后,就没有什么可以打断的了。
  • 所以如果我在threads.start 之后和threads.join 之前使用iterrupt,会有什么不同吗?我想这违背了加入的目的?
  • 这里有很多关于Thread.interrupt()的问题。在你自己做更多的测试之前,我建议你做some research。这并不像听起来那么简单。
  • 从另一个角度看:也许你的线程的可运行代码应该是检查done状态的代码,它们可以自行终止,而不是使用外部线程(这里:主线程)来控制它们。只是一个想法。

标签: java multithreading


【解决方案1】:

我想知道的是“thread.interrupt()”是否按照我认为的那样做。

不,它没有。

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

主线程将阻塞thread1.join(),直到线程1也发现了这个东西,或者没有找到任何东西就结束了,或者被第三个线程中断了。

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

另一种方法是不为每个线程调用 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();
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2012-03-31
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多