一文搞懂 Java 线程中断
转载自 一文搞懂 Java 线程中断
在之前的一文《如何"优雅"地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享的——线程中断。
下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了。
try {Thread.sleep(3000);
} catch (InterruptedException e) {e.printStackTrace();
}
此时线程被打断后,代码会继续运行或者抛出异常结束运行,这并不是我们需要的中断线程的作用。
到底是什么是线程中断?
线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号,如果目标线程没有接收线程中断的信号并结束线程,线程则不会终止,具体是否退出或者执行其他逻辑由目标线程决定。
我们来看下线程中断最重要的 3 个方法,它们都是来自 Thread 类!
1、java.lang.Thread#interrupt
中断目标线程,给目标线程发一个中断信号,线程被打上中断标记。
2、java.lang.Thread#isInterrupted()
判断目标线程是否被中断,不会清除中断标记。
3、java.lang.Thread#interrupted
判断目标线程是否被中断,会清除中断标记。
线程中断实战
我们来实例演示下线程中断如何用!
示例1(中断失败)
/*** 微信公众号:Java技术栈*/
private static void test1() {Thread thread = new Thread(() -> {while (true) {Thread.yield();}});thread.start();thread.interrupt();
}
请问示例1中的线程会被中断吗?答案:不会,因为虽然给线程发出了中断信号,但程序中并没有响应中断信号的逻辑,所以程序不会有任何反应。
示例2:(中断成功)
/*** 微信公众号:Java技术栈*/
private static void test2() {Thread thread = new Thread(() -> {while (true) {Thread.yield();// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println("Java技术栈线程被中断,程序退出。");return;}}});thread.start();thread.interrupt();
}
我们给示例2加上了响应中断的逻辑,程序接收到中断信号打印出信息后返回退出。
示例3(中断失败)
/*** 微信公众号:Java技术栈*/
private static void test3() throws InterruptedException {Thread thread = new Thread(() -> {while (true) {// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println("Java技术栈线程被中断,程序退出。");return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println("Java技术栈线程休眠被中断,程序退出。");}}});thread.start();Thread.sleep(2000);thread.interrupt();
}
示例3 sleep() 方法被中断,并输出了 Java技术栈线程休眠被中断,程序退出。
程序继续运行……为什么呢?
来看 sleep 的源码:
可以看出 sleep() 方法被中断后会清除中断标记,所以循环会继续运行。。
示例4(中断成功)
/*** 微信公众号:Java技术栈*/
private static void test4() throws InterruptedException {Thread thread = new Thread(() -> {while (true) {// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println("Java技术栈线程被中断,程序退出。");return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println("Java技术栈线程休眠被中断,程序退出。");Thread.currentThread().interrupt();}}});thread.start();Thread.sleep(2000);thread.interrupt();
}
示例4全部信息输出并正常退出,只是在 sleep() 方法被中断并清除标记后手动重新中断当前线程,然后程序接收中断信号返回退出。
一文搞懂 Java 线程中断相关推荐
- java吵醒线程_一文搞懂 Java 线程中断
在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...
- java sleep方法_一文搞懂 Java 线程中断!
在之前的一文<如何"优雅"地终止一个线程>详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享 ...
- 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 一文搞懂JAVA与GO垃圾回收
导语 现代高级编程语言管理内存的方式分为两种:自动和手动.像 C.C++ 等编程语言使用手动管理内存的方式,编写代码过程中需要主动申请或者释放内存:而 PHP.Java 和 Go等语言使用自动的内存 ...
- 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 一文搞懂Java的多线程底层逻辑,再也不怕多线程了
目录 1.线程是什么 2.启动线程 3.线程池 4.线程池的创建 通过Executors工厂方法创建 通过构造函数创建 5.调试线程 6.synchronized关键字 没什么想说的,就是想写两次Ja ...
- 一文弄懂Java线程安全队列
文章目录 一.分类 二.BlockingQueue 阻塞队列 三.ConcurrentLinkedQueue 非阻塞队列 一.分类 java中所有队列都继承至java.util.Queue接口,该接口 ...
- 一文搞懂Java自定义线程池参数
背景: 线程是一个开发经常使用的东西,但是实际工作中很少有新建一个线程去执行任务,线程的创建和销毁都会耗费资源,我们一般都会用线程池来完成线程的创建和销毁. 多说一句 JDK自带的线程池不建议大家去使 ...
最新文章
- 告别「灭霸式审稿」,IJCAI-21 的投稿者爽到家!
- 浅析物流行业文档规范管理
- xbox无线适配器驱动_手柄杂谈,PS4手柄,Xbox手柄使用感受
- UOJ #164 [清华集训2015]V (线段树)
- java dump命令例子,常用命令示例
- Hadoop源码分析21:namenode概要
- 配置数据库连接池的时候。
- $.ajax(0,jQuery Ajax显示0而不是Array(jQuery Ajax showing 0 instead of Array)
- php dht爬虫,利用DHT网络,爬取bt种子。
- 78M05-ASEMI三端稳压管78M05
- 【MATLAB】MATLAB三维曲面绘制【详细教程】
- 计算机搜索不到PDF,PDF能打印吗,pdf虚拟打印机找不到
- 金融计算器--麦考利久期(Macaulay_Duration)
- 荣耀8微信总是无法连接服务器,微信无法登陆想要登陆的王者荣耀账号,怎么办?...
- 第五章第五题(千克与磅之间的互换)(Conversion from kilogram to pound and pound to kilogram)
- J2ME--丰富多彩的领域中生机勃勃的技术
- 云计算机和云储存,云计算和云存储是什么关系?
- Caffe中的损失函数
- MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
- 自下而上语法制导翻译过程
热门文章
- [SpringSecurity]web权限方案_自动登陆_原理分析和具体实现
- [JavaWeb-HTML]HTML标签_块标签
- [设计模式]依赖倒转原则
- [C++STL]常用拷贝和替换算法
- Power Strings POJ - 2406(求一串字符串中有多少个循环节)
- c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt
- Linear Programming_the simplex method in tableau format
- 51nod 1847 奇怪的数学题(数论/min25筛/杜教筛/斯特林数)
- 【Luogu3768】简单的数学题(莫比乌斯反演/杜教筛/欧拉函数)
- Codeforces Round #703 (Div. 2) B.Eastern Exhibition 中位数结论