在 Thread.join() 之前调用 Thread.interrupt() 是否会导致 join() 立即抛出中断异常?
不,它不会扔。仅当调用该方法的当前线程被中断时,才会抛出 。 正在中断您刚刚启动的线程,而仅当执行连接的线程(也许是主线程?)本身被中断时才会抛出。join()
join()
InterruptedException
t.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()
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;
}
}