java线程 stop()_java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())...

JAVA中有3种方式可以终止正在运行的线程

①线程正常退出,即run()方法执行完毕了

②使用Thread类中的stop()方法强行终止线程。但stop()方法已经过期了,不推荐使用

③使用中断机制interrupt()

1.stop()方法

stop()在java多线程中已经废弃

1.stop()方法会导致释放锁的不良后果,数据不完整

比如一个上锁了得方法:

threadA线程拥有了监视器,这些监视器负责保护某些临界资源,比如说银行的转账的金额。当正在转账过程中,main线程调用 threadA.stop()方法或者this.stop()。结果导致监视器被释放,其保护的资源(转账金额)很可能出现不一致性。比如,A账户减少了100,而B账户却没有增加100,没有保证数据原子性

2.当线程调用stop()方法时,会立刻终止线程的所有操作,并抛出ThreadDeath异常,通常不需要捕捉

2.interrupt() 中断机制

这个方法是实例方法 ,但是它不会真的中断一个正在运行的线程,而是给线程打一个停止的标记,还需要配合判断来优雅的终止线程

e73baf6f3c9f469c5ba31141a3d4f99e.png

运行代码

b5679aa4ba887b48384ead074d8c89e7.png

输出结果

77955d37ef4b01ddeb52790ce160e3b9.png

可以看的出来  ,interrupt() 并不会真正的停止正在运行的线程,那么如何停止线程呢

3.判断线程的停止状态

interrupted()方法与 isInterrupted()方法能反映当前线程的终止状态

04d80a9998b5f3fadcfb5f61a71e780c.png

0bff140505f3cdb12cb9e16213017c0e.png

看的出来 interrupted() 是静态方法 而isInterrupted() 是实例方法

1.interrupted()方法

0986c2c9577f2caa540d334ddaea7cd5.png

3d279817e5a16f157ea9c5a1ee4c47c0.png

a03ee252262174b02a800310ec570818.png

c768204dd71ec7360df2cc36ab37dd39.png

可以从上面看出 interrupt()执行了线程interrupted() 方法 第一调用返回是true , 第二次调用返回时false,在这里查看interrupted()的源码发现该方法会清楚中断状态

publicbooleanisInterrupted(){

returnisInterrupted(false);

}

/**

* Tests if some Thread has been interrupted. The interrupted state

* is reset or not based on the value of ClearInterrupted that is

* passed.

*/

privatenativebooleanisInterrupted(booleanClearInterrupted);

源码发现该方法interrupted() 会调用isInterrupted 方法 传入 参数clean 状态,调用改方法,改方法内部会清除中断状态

2.isInterrupted()方法

继续根据上面的示例创建 Run3

e7848103b859053115a63c5d2fece2ec.png

总结了两个判断线程中断的区别  , 下面开始优雅的中断线程了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值