在Thread.join()之前调用Thread.interrupt()会导致join()立即抛出InterruptedException吗?

时间:2012-05-17 08:49:14

标签: java multithreading concurrency interrupt interrupted-exception

基本上,问题标题是什么。

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

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

2 个答案:

答案 0 :(得分:16)

interrupt()会中断您中断的线程,而不会中断执行中断的线程。

c.f。

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

答案 1 :(得分:15)

  

在Thread.join()之前调用Thread.interrupt()会导致join()立即抛出InterruptedException吗?

不,它不会扔。只有当调用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

同样重要的是要意识到中断线程不会取消它 join()不像Future,因为它将返回线程抛出的异常。

当您中断线程时,线程对sleep()wait()join()进行的任何调用以及其他可中断方法都会抛出InterruptedException。如果未调用这些方法,则线程将继续运行。如果一个线程 抛出一个InterruptedException以响应被中断然后退出,那么除非你使用t.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;
    }
 }