JDK Thread没有明确的退出方法,唯一的stop()方法还因为有死锁风险而被Deprecated了。所以Thread中有interrupt()方法进行线程的中断.
线程执行的方法有下面几种类型:
1.低级的阻塞方法:object.wait(),Thread.sleep(),Thread.join()等方法
2.synchronized同步语句或者方法,阻塞IO等不能中断的方法
3.其它方面
对于不同类型的方法,执行Thread.interrupt()方法的反馈也不一样:
对于1类,线程开始是在阻塞状态,中断后在方法中抛出InterruptedException异常
对于2类,中断没有任何的作用。对于阻塞io可以关闭底层的socket退出阻塞
对于3类,中断后,不会抛出异常,更新了thread status标志位,应用可以稍后通过Thread.isInterrrupted()进行检查,做对应的处理
InterruptedException的处理
InterruptedException看情况可以进行如下的处理:
1.不进行处理,直接抛出InterruptedException给上层系统处理
2.捕获InterruptedException,处理后重新抛出异常
3.捕获后重新设置中断状态
对于第3类方法,需要应用处理,如设计成退出循环,可以取消的任务等等:
try {
while (!Thread.currentThread().isInterrupted()) {
/**others**/
}
} catch (InterruptedException cusumed) {
}
通常代码都是一个while循环,如果中断了,就跳出这个循环了。这个代码有个不好的设计:对于InterruptedException没有做任何的处理,这个只有在知道线程正要退出循环的时候才能这么做。
当在线程中有判断条件的地方千万要注意,判断条件可能执行不到,因为可能有阻塞的方法,所以中断+判断条件是处理条件判断的模式
其它
LockSupport.park(),也是阻塞线程的,当线程中断后,该方法返回,但是不抛出异常,调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态.