如何优雅的停止线程

目录

interrupt

线程中断与终止


在一个线程T1中如何优雅停止线程T2,这里的优雅指的是给T2一个料理后事的机会

错误思路:

使用stop(),stop会真正杀死线程,如果这时线程锁住了共享资源,name当他被杀死后就再也没有机会释放锁,其他线程将永远无法获取锁,

使用System.exit(int)方法停止线程

目的是停止一个线程,但这种做法会让整个程序都停止

interrupt

可以打断睡眠线程,运行线程

打断处于阻塞状态线程(sleep,wait,join)

打断阻塞线程会抛出一个interruptedexception异常,抛出异常线程就停止了

如果线程被打断,打断标记就为true,但是对于sleep,wait,join,以异常方式提醒被打断,并且打断标记置为false

打断标记可用来去判断线程被打断后是继续运行还是就此终止

首先, 线程中会有一个中断标记的boolean值,记录当前线程是否打断,这只是一个标记值,并不会实际影响程序的运行,如果需要中断线程,需要自己手动操作。我自己初始化了A,B两个线程,A线程循环每2秒睡眠一次。B线程调用A线程的引用,执行interrupt方法,B想打断A这个线程,A线程的中断标记值设为true。

这时A线程会抛出InterruptedException异常,抛出异常后中断标记值会立即设为false。这里大家需要注意,B的本意是要打断A,让它中断,但你抛出异常后立即把中断标记设为了false,这相当于擅自改变了B的本意,所以需要在catch的代码块中加一行代码:Thread.currentThread().interrupt();来保证A线程的中断标记为true,是B想要的中断状态。

这只是一种规范操作,实际情况应该自己把握。

打断正常运行的线程不会清空打断状态

打断后状态标志位为true

可判断状态标志位进行选择性终止

线程中断与终止

线程中断仅仅是置线程的中断状态位,并不会停止线程。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,比如sleep、join等,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常,并且将中断标志重新置为false。所以在Java中设置线程的中断状态位并不会产生对线程运行的实际影响,而是通过监视线程的状态位并做相应处理,或者通过抛出中断异常(InterruptedException)来通知用户进行处理。

当调用线程的start方法之后,线程会开始驱动任务,当任务执行完毕之后(也就是run方法执行结束)线程将终止,但是如果因为线程阻塞或者线程长时间执行而不能结束,所以我们希望能够通过某种途径可以终止线程以达到想要的效果,常用的方式有两种:中断、检查中断。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

outlier--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值