在 Thread.join() 之前调用 Thread.interrupt() 是否会导致 join() 立即抛出中断异常?

基本上,问题标题说了什么。

Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?

从我自己的测试来看,它似乎,但只是想确定。我猜在执行其“等待”例程之前检查线程的状态?Thread.join()interrupted


答案 1

在 Thread.join() 之前调用 Thread.interrupt() 是否会导致 join() 立即抛出中断异常?

不,它不会扔。仅当调用该方法的当前线程被中断时,才会抛出 。 正在中断您刚刚启动的线程,而仅当执行连接的线程(也许是主线程?)本身被中断时才会抛出。join()join()InterruptedExceptiont.interrupt()t.join()InterruptedException

 Thread t = new Thread(someRunnable);
 t.start();
 t.interrupt();
 t.join();  // will _not_ throw unless this thread calling join gets interrupted

同样重要的是要认识到,中断线程不会取消它,也不会像 a 那样,因为它将返回线程引发的异常。join()Future

中断线程时,线程对 、 、 和其他可中断方法所做的任何调用都将引发 。如果未调用这些方法,则线程将继续运行。如果线程确实在响应中断时抛出 a,然后退出,则该异常将丢失,除非您使用了 。sleep()wait()join()InterruptedExceptionInterruptedExceptiont.setDefaultUncaughtExceptionHandler(handler)

在你的例子中,如果线程因为返回而中断并完成,那么连接将完成 - 它不会引发异常。正确处理中断的常用线程代码如下:

 public void run() {
    try {
       Thread.sleep(10000);
    } catch (InterruptedException e) {
       // a good pattern is to re-interrupt the thread when you catch
       Thread.currentThread().interrupt();
       // another good pattern is to make sure that if you _are_ interrupted,
       // that you stop the thread
       return;
    }
 }

答案 2

interrupt()中断中断的线程,而不是中断的线程。

断续器

Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException 

推荐