转载自   一文搞懂 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 线程中断相关推荐

  1. java吵醒线程_一文搞懂 Java 线程中断

    在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...

  2. java sleep方法_一文搞懂 Java 线程中断!

    在之前的一文<如何"优雅"地终止一个线程>详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享 ...

  3. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. 一文搞懂JAVA与GO垃圾回收

    导语  现代高级编程语言管理内存的方式分为两种:自动和手动.像 C.C++ 等编程语言使用手动管理内存的方式,编写代码过程中需要主动申请或者释放内存:而 PHP.Java 和 Go等语言使用自动的内存 ...

  6. 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. 一文搞懂Java的多线程底层逻辑,再也不怕多线程了

    目录 1.线程是什么 2.启动线程 3.线程池 4.线程池的创建 通过Executors工厂方法创建 通过构造函数创建 5.调试线程 6.synchronized关键字 没什么想说的,就是想写两次Ja ...

  8. 一文弄懂Java线程安全队列

    文章目录 一.分类 二.BlockingQueue 阻塞队列 三.ConcurrentLinkedQueue 非阻塞队列 一.分类 java中所有队列都继承至java.util.Queue接口,该接口 ...

  9. 一文搞懂Java自定义线程池参数

    背景: 线程是一个开发经常使用的东西,但是实际工作中很少有新建一个线程去执行任务,线程的创建和销毁都会耗费资源,我们一般都会用线程池来完成线程的创建和销毁. 多说一句 JDK自带的线程池不建议大家去使 ...

最新文章

  1. 告别「灭霸式审稿」,IJCAI-21 的投稿者爽到家!
  2. 浅析物流行业文档规范管理
  3. xbox无线适配器驱动_手柄杂谈,PS4手柄,Xbox手柄使用感受
  4. UOJ #164 [清华集训2015]V (线段树)
  5. java dump命令例子,常用命令示例
  6. Hadoop源码分析21:namenode概要
  7. 配置数据库连接池的时候。
  8. $.ajax(0,jQuery Ajax显示0而不是Array(jQuery Ajax showing 0 instead of Array)
  9. php dht爬虫,利用DHT网络,爬取bt种子。
  10. 78M05-ASEMI三端稳压管78M05
  11. 【MATLAB】MATLAB三维曲面绘制【详细教程】
  12. 计算机搜索不到PDF,PDF能打印吗,pdf虚拟打印机找不到
  13. 金融计算器--麦考利久期(Macaulay_Duration)
  14. 荣耀8微信总是无法连接服务器,微信无法登陆想要登陆的王者荣耀账号,怎么办?...
  15. 第五章第五题(千克与磅之间的互换)(Conversion from kilogram to pound and pound to kilogram)
  16. J2ME--丰富多彩的领域中生机勃勃的技术
  17. 云计算机和云储存,云计算和云存储是什么关系?
  18. Caffe中的损失函数
  19. MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
  20. 自下而上语法制导翻译过程

热门文章

  1. [SpringSecurity]web权限方案_自动登陆_原理分析和具体实现
  2. [JavaWeb-HTML]HTML标签_块标签
  3. [设计模式]依赖倒转原则
  4. [C++STL]常用拷贝和替换算法
  5. Power Strings POJ - 2406(求一串字符串中有多少个循环节)
  6. c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt
  7. Linear Programming_the simplex method in tableau format
  8. 51nod 1847 奇怪的数学题(数论/min25筛/杜教筛/斯特林数)
  9. 【Luogu3768】简单的数学题(莫比乌斯反演/杜教筛/欧拉函数)
  10. Codeforces Round #703 (Div. 2) B.Eastern Exhibition 中位数结论