Java线程中断

首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。

Thread.interrupt 的作用其实也不是中断线程,而是 通知线程应该中断了

具体到底中断还是继续运行,应该由被通知的线程自己处理。具体来说,当对一个线程,调用 interrupt() 时: ① 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。仅此而已。 ② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。

interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。也就是说,一个线程如果有被中断的需求,那么就可以这样做: ① 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。 ② 在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)

Thread thread = new Thread(() -> {
 while (!Thread.interrupted()) {
 // do more work.
 }
 });
 thread.start();
// 一段时间以后
 thread.interrupt();

Thread.interrupted():返回当前线程中断状态,并清除标志位是为了下次继续检测标志位。如果一个线程被设置中断标志后,选择结束线程那么自然不存在下次的问题,而如果一个线程被设置中断标识后,进行了一些处理后选择继续进行任务,而且这个任务也是需要被中断的,那么当然需要清除标志位了。

参考资料: https://www.zhihu.com/question/41048032

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JUC学习笔记(四)—线程池

    线程池 【死磕Java并发】—–J.U.C之线程池:ThreadPoolExecutor

    Monica2333
  • JUC学习笔记(一)—锁工具类

    LockSupport类:用于阻塞线程,基于线程的阻塞。而wait,notify是基于对象的,用于synchronized同步块中。 使用和原理: 浅谈Ja...

    Monica2333
  • 什么是socket?

    Socket编程进行的是端到端的通信,基于网络层和传输层的实现。在网络层,Socket 函数需要指定到底是 IPv4 还是IPv6。传输层需要指定是tcp还是u...

    Monica2333
  • netty 线程模型(未完成)

    虽然Netty的线程模型基于主从Reactor多线程,借用了MainReactor和SubReactor的结构。但是实际实现上SubReactor和Worker...

    平凡的学生族
  • 必须要掌握的 InterruptedException 异常处理

    在了解InterruptedException异常之前应该了解以下的几个关于线程的一些基础知识。而且得知道什么时候会抛InterruptedException异...

    黄泽杰
  • 阿里大佬带你,深入理解线程池底层原理

    在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。 因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处...

    李红
  • Java 中的锁原理、锁优化、CAS、AQS 详解!

    结论:如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

    Java团长
  • Java 中的锁原理、锁优化、CAS、AQS 详解!

    结论:如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

    芋道源码
  • 你必须要知道的锁原理、锁优化、CAS、AQS

    出处:https://www.jianshu.com/p/e674ee68fd3f

    好好学java
  • Python多线程之线程锁(Lock)和递归锁(RLock)实例

    Threading模块为我们提供了一个类,Threading.Lock锁。我们创建一个该类对象,在线程函数执行前,“抢占”该锁,执行完成后,“释放”该锁,则我们...

    橙子探索测试

扫码关注云+社区

领取腾讯云代金券