《多线程编程》学习之三:停止线程 interrupt()、isInterrupted()、 Thread.interrupted()

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(),可完成线程的停止。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值