Java 改为抛出新的InterruptedException()
我尝试使用.interrupt()方法停止线程 这是我的密码:Java 改为抛出新的InterruptedException(),java,multithreading,interrupted-exception,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()) { coun
@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();
}
}
如果我抛出InterruptedException,它也会工作
if (counter.isInterrupted()) {
throw new InterruptedException();
}
我不明白的是为什么我会选择一个而不是另一个。我还看到一些方法,人们也使用易变的布尔变量。是否比我的方法更安全?一个
InterruptedException
表示当前线程在操作过程中被中断。第二个选项的问题是,在其他线程被中断的基础上抛出异常。这将导致调用代码产生错误的印象
根据经验,当您捕获到中断异常时,您应该执行以下三项操作之一:
- 重新播放它(没有包装器异常),以便调用者知道中断
- 重新设置中断()
- 处理中断(通常通过清理和关闭线程)
中断异常
表示当前线程在操作过程中被中断。第二个选项的问题是,在其他线程被中断的基础上抛出异常。这将导致调用代码产生错误的印象
根据经验,当您捕获到中断异常时,您应该执行以下三项操作之一:
- 重新播放它(没有包装器异常),以便调用者知道中断
- 重新设置中断()
- 处理中断(通常通过清理和关闭线程)
如果调用join()
,则等待此线程完成。如果在当前线程上调用join()
,它将永远等待。您不需要在线程死亡时中断线程。使用break代码>中断循环就可以了。当用户按下某个按钮时,我想停止线程…重复“我想停止线程…”不要对正在运行的线程执行任何操作:编写要求线程执行任何操作的代码。不要把t.interrupt()
看作是停止线程的函数:把它看作是引起线程注意的一种方式。t.interrupt()
最常见的原因是要求线程t
优雅地关闭自身,其中“优雅”的意思是,不让共享变量处于任何虚假状态,这将破坏程序的其余部分。您可能必须为InterruptedException
编写处理程序,以确保“优雅”部分。还要注意:t.interrupt()
不会在从不等待任何内容的线程中导致异常。如果线程只执行计算,那么如果希望t.interrupt()
对其产生任何影响,则必须编写定期检查isInterrupted()
的代码。如果调用join()
,则等待此线程完成。如果在当前线程上调用join()
,它将永远等待。您不需要在线程死亡时中断线程。使用break代码>中断循环就可以了。当用户按下某个按钮时,我想停止线程…重复“我想停止线程…”不要对正在运行的线程执行任何操作:编写要求线程执行任何操作的代码。不要把t.interrupt()
看作是停止线程的函数:把它看作是引起线程注意的一种方式。t.interrupt()
最常见的原因是要求线程t
优雅地关闭自身,其中“优雅”的意思是,不让共享变量处于任何虚假状态,这将破坏程序的其余部分。您可能必须为InterruptedException
编写处理程序,以确保“优雅”部分。还要注意:t.interrupt()
不会在从不等待任何内容的线程中导致异常。如果你的线程除了计算什么都不做,那么如果你想t.interrupt()
对它有任何影响,你就必须编写定期检查isInterrupted()
的代码。
if (counter.isInterrupted()) {
throw new InterruptedException();
}