1、停止线程
1.1 停止不了的线程
interrupt()方法不会终止一个正在运行的线程,它只是给线程打上一个标志。
可见,调用interrupt()方法并没有停止线程。
1.2 判断线程是否是停止状态
1.2.1 Thread.interrupted():测试当前执行的线程是否已经中断,会清除线程的中断状态。
例子一:
由于当前正在执行的线程是main线程,它没有中断过,所以thread.interrupted()输出false。
例子二:
第一次调用Thread.interrupted()方法已经清除了中断标志,所以第二次调用时,返回的是false。
1.2.2 isInterrupted() :测试线程对象是否已经是中断状态,但不清除标志。
可以看出,main线程与thread线程是执行异步的,isInterrupted()方法并不清除标志位。
1.3 利用“异常法”停止线程
(1)利用中断标志位,退出线程
思考下,上面的停止线程的方法有什么问题?如果for语句下面还有语句,那么线程还是会继续运行的,该如何解决这个问题?
(2)改进:检查中断标志,利用“异常法”退出线程
1.4 线程在sleep()状态下被停止:
注意:如果线程在sleep()状态下被停止,会进入catch语句块,并且清除中断标志,使之为false。
1.5 暴力停止线程:stop()方法
调用stop()方法会抛出java.lang.ThreadDeath异常,stop()方法已经被废弃,因为如果强制让线程停止的话,有可能使一些清理性工作得不到完成。另外可能会对锁定的对象进行“解锁”,导致数据得不到同步的处理,出现数据不一致的情况。
1.6 使用return停止线程
书上建议使用“抛异常”的方法来实现线程停止,因为在catch块中可以将异常向上抛,使线程停止的时间得以传播。
总结:在java中有3中方法可以终止正在运行的线程:
1)使用退出标志,使线程正常退出。
2)使用stop()方法,但不建议使用。
3)使用interrupt()方法中断线程,加入判断isInterrupted()或Thread.interrupted(),可完成线程的停止。