【发布时间】: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