如何中断线程

如何中断线程
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

你可能感兴趣的:(如何中断线程)