java 中断的一些事

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(),也是阻塞线程的,当线程中断后,该方法返回,但是不抛出异常,调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定返回时该线程的中断状态.

posted on 2011-09-22 14:17 nod0620 阅读(822) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年6月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜