我尝试使用.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();
}
我不明白的是为什么我会选择一个而不是另一个。我也看到了一些人们也使用易失性布尔变量的方法。比我的方法安全吗?
答案 0 :(得分:5)
InterruptedException
表示当前线程在操作过程中已被中断。第二种选择的问题是,您在某些 other 线程被中断的基础上引发了异常。这将导致通过调用代码产生错误的印象。
根据经验,当您抓到InterruptedException
时,应该做以下三件事之一:
interrupt()
,以便保持该线程被中断的事实