是否调用了Thread.interrupt()一个的Thread.join()之前引起join()方

2019-06-24 12:48发布

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

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

从我自己的测试,它似乎,只是想确认。 我猜Thread.join()检查interrupted做它的“等待”程序之前,该线程的状态?

Answer 1:

interrupt()中断你打断线程,而不是线程执行中断。

比照

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


Answer 2:

是否调用了Thread.interrupt()一个的Thread.join()之前引起join()方法立即抛出一个InterruptedException?

不,它不会抛出。 只有当正在调用当前线程join()方法被中断将join()抛出InterruptedExceptiont.interrupt()被打断,你刚开始线程,而t.join()将只抛出InterruptedException如果是做加盟-ING(也许主线程?)线程本身中断。

 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;
    }
 }


文章来源: Does calling Thread.interrupt() before a Thread.join() cause the join() to throw an InterruptedException immediately?