抛出新的 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()
,以维持该线程被中断的事实
- 处理中断(通常通过清理和关闭线程)
我尝试使用 .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()
,以维持该线程被中断的事实 - 处理中断(通常通过清理和关闭线程)