InterruptedExceptions会清除线程的中断状态

问题描述

image.png

如图,之前有个疑问:
1处已经给thread设置了中断,当主线程执行完1后,thread再循环到2处代码时,中断状态应该是true,这是应该走不进while循环而线程结束,可是结果为啥没有结束,而是继续循环执行。

原因分析

4处抛出 InterruptedException时,相当于被动的清除了中断标记。因为JVM认为你如果catch了这个中断异常,就代表你要去处理它,所以JVM会清除中断状态,避免每次抛出异常后还需要手动去做清除中断状态等操作。这样做,如果你只是简单地catch住,并不打算处理,那么就需要恢复被清除的中断位,让上层知晓,所3处以需要再次调用interrupt()。

结论总结

可以这样认为:main线程主动中断thread线程后,thread线程抛出异常,这时thread线程是否中断应该由thread自己决定,即在catch块中写逻辑,所以InterruptedException就去清除main线程执行后的中断状态。

你可能感兴趣的:(java后端)