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