【问题标题】:Throw new InterruptedException() instead .join()抛出 new InterruptedException() 而不是 .join()
【发布时间】:2019-01-05 11:59:43
【问题描述】:

我尝试使用 .interrupt() 方法停止线程。

这是我的代码:

@Override
public void run() {
    try {

        for (int i = 0; i < 1000000000; i++) {
            System.out.println(threadName + " generated " + i);
            if (counter.isInterrupted()) {
                counter.join();
            }
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

我不明白的是,而不是这段代码:

if (counter.isInterrupted()) {
    counter.join();
}

如果我抛出一个 InterruptedException 它也可以工作。

if (counter.isInterrupted()) {
    throw new InterruptedException();
}

我不明白为什么我会选择一个而不是另一个。此外,我还看到了一些人们也使用 volatile 布尔变量的方法。比我的方法更安全吗?

【问题讨论】:

  • 如果你调用join(),你等待这个线程完成。如果您在当前线程上调用join(),它将永远等待。
  • 你不需要在线程死亡时中断它。使用break; 打破循环就好了。
  • 我想在用户按下某个按钮时停止线程...
  • Re,“我想停止线程......”永远不要对正在运行的线程事情:编写询问的代码> 线程做任何事情。不要将t.interrupt() 视为停止线程的函数:将其视为引起线程注意的一种方式。 t.interrupt() 最常见的原因是要求线程 t 优雅地关闭自己,其中“优雅地”意味着不让共享变量处于任何会破坏程序其余部分的虚假状态。您可能必须为 InterruptedException 编写处理程序以确保“优雅”部分。
  • 另请注意:t.interrupt()不会在从不等待任何内容的线程中引发异常。如果您的线程只做计算,那么您必须编写代码定期检查isInterrupted(),如果您希望t.interrupt() 对其产生任何影响。

标签: java multithreading interrupted-exception


【解决方案1】:

InterruptedException 表示当前线程在操作过程中被中断。您的第二个选项的问题是您在某些 other 线程被中断的基础上抛出异常。这会导致调用代码产生错误的印象。

根据经验,当您收到InterruptedException 时,您应该做以下三件事之一:

  • 重新抛出它(没有包装异常),以便调用者知道中断
  • 重新设置interrupt(),从而保持该线程被中断的事实
  • 处理中断(通常通过清理和关闭线程)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多