auto.js停止所有线程_Java并发学习第二弹:如何正确停止线程?

本文深入探讨了在Java中如何优雅地停止线程,强调使用`interrupt`作为协作停止机制,而非强制停止。文章通过实例展示了线程停止的各种情况,包括`Thread.sleep()`的中断处理,讨论了中断标志的重置问题,并提醒开发者避免使用已废弃的`stop`、`suspend`和`resume`方法,以及volatile变量作为停止标志的局限性。同时,提出了在无法传递中断时恢复中断的策略,以及介绍了可以响应中断的阻塞方法。
摘要由CSDN通过智能技术生成

线程停止的原则:使用interrupt来通知,而不是强制停止线程

interrupt在英文中实为通知的意思,那么为什么停止线程不直接停止而使用通知呢?

这是因为在java中,我们如果想要停止一个线程,能做的最多就是告诉线程需要被中断了,而线程本身决定何时停止或者停不停止。

大多数情况我们是可以让系统中的线程运行直到结束的,或者让他们自动停止。然而其实有时候,作为开发者或者用户是希望提前结束线程的。

但是要让任务安全并且迅速停止下来并不是一件容易的事,java并没有提供任何机制来安全的停止线程,只提供了中断(interruption),这其实是一种协作机制,让一个线程去通知另外一个线程停止当前的工作。

我们很少希望某个线程的服务立即停止而不进行任何收尾工作留下一堆烂摊子,因为这样会使线程间共享的数据的状态展现出不一致的状态,那么当我们使用协作的方法去停止线程,线程会先完成手头上的工作并清除掉未开始的工作,然后再结束,这样可以保证共享资源状态的一致性,更加的安全。

实践:如何正确停止线程

线程什么情况下会停止呢?

1.run中所有方法执行完毕了 2.有异常出现且系统没有捕获

如何使用interrupt来停止线程?

通常情况下停止:

public 

不使用thread.interrupt();语句中断线程时的结果:

d408242fdcb205b78bef88964e11c3bf.png

使用thread.interrupt();语句中断线程时的结果:

7cedf57cd82f1b3764640d4af03e0ede.png

线程可能被阻塞:

public 

执行结果:

74e759ef145fabfad95d9307f4b63c89.png

当我们thread.interrupt();生效时,恰逢Thread.sleep(1000);生效期内,那么为什么会抛出这个异常呢?因为我们这里的catch (InterruptedException e) 的存在,线程会响应这个中断,响应中断的方式是打印出这个异常,可以从异常信息中看出:sl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值