入门者如何在学习Java过程优雅关闭线程!

Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。文本将介绍两种可以优雅的终止线程的方式…

第一种

在JAVA《Java多线程模式》中有一种叫Two-Phase Termination(两步终止)的模式可以优雅的终止线程,这种模式采用了两个步骤来终止线程,所以叫两步终止模式。

先将执行标志位isShutdown 设为false,使工作中的线程转变为终止处理中的状态

真正去执行终止操作,这样的做法可以保证线程的安全性、生命性和响应性。

运行日志

安全性:不会在线程正在执行关键区域--Critical Section的时候突然结束掉

生命性:一定会进行终止处理,shutdown()中,会调用interrupt(),保证即使线程处于sleep或wait状态也可以被立即终止

响应性:将isShutdown 设为volatile ,能保证线程收到终止请求后,会尽快开始终止处理。

存在的问题:针对没有阻塞的情况:设置标志变量,让线程正常自然死亡,和谐!,但是如果在调用shutdown发生阻塞情况呢?

第二种

在 《多线程第一章》的时候,介绍过守护线程的作用,那么是不是可以通过开启守护线程的方式去监听

功能

1.当工作结束就关闭主线程(主线程销毁守护线程也会跟着一同销毁)

2.如果任务长时间未完成,停止工作任务,减少开销

编码

1.定义主线程与发送的指令

2.在主线程run方法中创建一个守护线程,用来执行我们投递的任务

3.前面已经介绍过join的功能,它可以阻塞主线程,等待子线程完成后主线程继续执行

4.如果join释放后,发送完成指令

5.创建listener(long mills),监听工作情况

6.监听任务是否完成,如果未完成监听当前是否逾期,逾期打断线程结束监听

7.测试

listener(4 * 1000) 的运行日志,当任务完成会直接退出,并不会一直占用

listener(2 * 1000) 的运行日志,当任务超时直接打断线程,减少资源占用

好了,今天的话题到这里就结束了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值