应该算是初级问题吧,但之前的确不知道,解决这个问题的契机,还是因为最近我集成了 Sonar 代码质量管理工具,针对 Tread.sleep() 方法抛出的 InterruptException ,工具要求不能只进行简单的捕获及日志记录。
以此为契机,我了解了 InterruptException 的处理方法,及 多线程 中断的机制。
之前我一直认为 线程A 调用 线程B 的 interrupt 方法,是立即就中断 B 线程的,然而了解之后,我才发现,并不是这样,interrupt方法只是改了一个标识, java里面能终止线程的,只有自己,其他线程只是发起了中断请求。
也就是说,A调用B的中断方法,B的中断标识发生改变,B需要自己检测监控该状态,在检测到中断状态后,需要自己处理好中断前的资源释放的操作,然后自己了结自己。
当A调用B的中断方法时,如果B的线程正在进行阻塞(例如 sleep、wait 等),那么此时就会抛出 InterruptExcpetion,同时B线程的中断状态会被重置false,此时两种处理办法: 一、在捕获到InterruptException时,可以将该线程的中断状态重新置为true,并记录日志。这样做相当于维持B线程中断状态不变。 二、将异常继续抛出。
参考: