抛出新的InterruptedException()代替.join()

时间:2019-01-05 11:59:43

标签: java multithreading interrupted-exception

我尝试使用.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();
}

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

1 个答案:

答案 0 :(得分:5)

InterruptedException表示当前线程在操作过程中已被中断。第二种选择的问题是,您在某些 other 线程被中断的基础上引发了异常。这将导致通过调用代码产生错误的印象。

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

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