Java 改为抛出新的InterruptedException()

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

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