抛出新的 InterruptedException() 而不是 .join()

Throw new InterruptedException() instead .join()

我尝试使用 .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 布尔变量的方法。比我的方法更安全吗?

一个InterruptedException的意思是表示当前线程在一个操作的过程中被中断了。你的第二个选项的问题是你在一些 other 线程被中断的基础上抛出异常。这样会造成调用代码的错误印象。

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

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