0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

如何优雅的中断线程

中断一个线程,我们可能最先想到的是stop方法。但是我们可以发现,这个方法以及被废弃了?

1、为什么不能使用stop中断线程?

stop掉一个线程,会是他解锁所有已经获取到的锁。突然不安全的解锁了锁,可能导致某些数据被损坏,这些破坏性的行为是无法预测的,进而导致各种奇怪的行为。

设想一下:杀死一个正在将文件写入磁盘的线程,您可能最终会损坏这个文件。

所以,这个方法被弃用了,那有没有什么其他方法呢,接下来就进行说明。

2、Thread.interrupt()信号

该方法会把线程的中断状态位设置为true,不会直接中断了线程的执行。

2.1、如何判断线程是否被发送了中断请求?

一般用Thread.currentThread().isInterrupted()方法进行判断,一般常用做法是在循环条件中进行判断,如果未被中断则继续执行后续的工作:

1
2
3
while(!Thread.currentThread().isInterrupted() && 还有其他工作要做){
继续工作
}

2.2、处于阻塞的线程接收到中断信号会抛异常

由以下方法导致的阻塞:Thread.sleep, Thread.join, Thread.wait等,会在接收到中断请求后会抛出InterruptedException异常,抛出异常的同时会将线程中断标识位清除。至于抛出异常后,程序要如何处理,则交由程序员来处理。

2.3、在锁中使用中断

synchronized锁的底层实现方式决定了其是无法响应中断的。

ReentrantLock的lock()方法也是无法响应中断的。不过tryLock和lockInterruptibly却可以响应中断,这对处理死锁问题比较有用。具体实现则用到了interrupt和响应interrupt,可以阅读源码进一步了解。

2.4、底层如何处理中断

最好不要在底层把中断处理掉。可以往上抛异常,或者调用Thread.currentThread.interrupt()重新设置中断标识。

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法