Calvin's Tech Space

成于坚忍,毁于浮躁

   :: 首页 :: 联系 :: 聚合  :: 管理
1.不要使用thread.stop()方法。
2.使用共享变量来检查是否需要终止线程。
但是如果线程被阻塞了,它就不可能去主动去检查变量了,这时要使用thread.interrupt来中断线程吗?
谨慎使用thread.interrupt方法!

Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

因此,如果线程被上述几种方法阻塞,正确的停止线程方式时设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,线程
最后都将检查共享变量然后再停止。


中断标志必须是volatile的,以便run方法能够看到它,否则的话,这个值很有可能在本地有缓存。

线程代码为:
 1 public void run() {  
 2     while(running) { 
 4         try {  
 5             // do something may block...

 9         } catch (InterruptedException e) {  
10             running = false
12         }  
13   
14     }   //while  
15     //.  
16 

需要停止线程时,调用:
1 running = false;
2 thread.interrupt();

注意,一定要先设置标志位后再调用interrupt!

如果线程因为其他原因阻塞,例如socket.accept(),这时,调用interrupt不会抛出异常,又该如何处理?
这些情况下,需要分别处理,例如在socket上调用close方法,它将抛出一个SocketException,这与抛出InterruptException类似。

参考:
1、http://blog.csdn.net/nihaozhangchao/archive/2010/01/07/5147803.aspx
2、http://blog.chenlb.com/2009/07/incorrect-use-thread-interrupt-cause-not-exit.html
posted on 2010-10-29 16:44 calvin 阅读(657) 评论(0)  编辑  收藏 所属分类: Java

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


网站导航: