测试环境:JDK1.8
测试代码:
@Test
public void testJoin() throws InterruptedException {
Thread t1 = new Thread() {
@Override
public void run() {
try {
this.join();
} catch (InterruptedException e) {
// 自身join方法的异常能正常捕获
System.out.println("t1 异常: InterruptedException");
}
System.out.println("t1 over");
}
};
Thread t2 = new Thread(() -> {
try {
t1.join();
} catch (InterruptedException e) {
// 其它线程join方法的异常不能捕获
System.out.println("t2 异常: InterruptedException");
}
System.out.println("t2 over");
});
t1.start();
t2.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("终止线程: t1");
t1.interrupt();
TimeUnit.SECONDS.sleep(5);
}
执行结果:
终止线程: t1
t1 异常: InterruptedException
t1 over
t2 over
当前执行interrupt()方法终止线程t1之后,只有t1的this.join()有抛出异常,线程 t2的t1.join()却没有抛异常(我本以为也会抛的)。
我猜想,这是因为Thread.interrupt()这方法其实不是直接中断线程的,只向该线程发出中断信号,实际要不要中断还是要线程自身判断,如果需要中断那直接结束执行就好了,而这个中断信号只能由线程自身来处理,所以这个异常也只能由线程自身来捕获。