在之前的一文《如何"优雅"地终止一个线程》中详细说明了 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() 方法被中断并清除标记后手动重新中断当前线程,然后程序接收中断信号返回退出。

通过以上 4 个中断示例,相信对 Java 线程中断的概念有了全面的了解。

本文原创首发于公众号:Java技术栈(ID:javastack),关注公众号回复关键字:java,可以获取更多博主精心整理的Java技术干货。

java吵醒线程_一文搞懂 Java 线程中断相关推荐

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

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

  2. java构造器 权限_一文搞懂Java的 构造方法 和 访问权限

    目录 零.前言 Java是一门当今最火的编程语言之一,拥有很多现成可用的库,在我们编程生涯中,有着无比重要的地位. Java中有个概念叫做访问权限.它们是什么呢?今天我来详细讲解. 本文所有代码已经上 ...

  3. java rest 序列化_一文看懂Java序列化

    一文看懂Java序列化 简介 首先我们看一下wiki上面对于序列化的解释. 序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓 ...

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

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

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

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

  6. java arraylist排序_一文读懂Java集合框架

    欢迎关注微信公众号:深入浅出Java源码 概念 Java集合框架为程序员提供了预先包装的数据结构和算法来操纵他们.集合框架被设计成要满足以下几个目标. 该框架必须是高性能的.基本集合(动态数组,链表, ...

  7. java+输出流++空值_一文搞定Java的输入输出流等常见流

    点赞再看,养成习惯,常用流,多看多练准没错!文章较长,建议收藏再看! 1.IO流分析 什么是IO? I:Input O:Output 通过IO可以完成对硬盘的读和写. IO流的分类. 有多种分类方式: ...

  8. java 委派关系_一文读懂java类加载之双亲委派机制

    一个编译后的class文件,想要在JVM中运行,就需要先加载到JVM中.java中将类的加载工具抽象为类加载器,而通过加载工具加载类文件的具体方式被称为双亲委派机制. 知识点 类加载器:通过一个类全限 ...

  9. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

最新文章

  1. Swift与LLVM-Clang原理与示例
  2. 防火墙/IDS测试工具Ftester
  3. 一.jquery.datatables.js表格显示
  4. php内置函数和扩展,PHP 内置函数strlen 和mbstring扩展函数mb_strlen的区别
  5. Pytorch——批标准化(层归一化)
  6. 原生JS实现旋转轮播图+文字内容切换
  7. 华南理工大学811信号与系统真题
  8. 天龙八部单机服务器修改器,天龙八部 天佛降世多功能属性修改器
  9. 企业信息化管理软件,如何走出开发困境
  10. 自动定量包装机机械及控制系统设计(PLC控制)
  11. 字节跳动CEO梁汝波接棒张一鸣一年:使命是我们前进的动力
  12. 致歉信:拖更两天抱歉了
  13. ubuntu uninstall
  14. 归并排序 (递归 非递归)
  15. 公司企业邮箱附件多大?免费企业邮箱附件有限制吗?
  16. 大厂钟爱的全链路压测有什么意义?四种压测方案详细对比分析
  17. 安徽隐秘后花园,景色绝美动人,人生必去不去遗憾
  18. 理解DCT与DST【二】:离散余弦变换
  19. FlexE( Flex Ethernet灵活以太网)
  20. 自适应模糊推理系统(ANFIS)模型研究(Matlab代码实现)

热门文章

  1. 学python可以干嘛-学完Python可以做什么?
  2. 用python画花瓣-Python教程:使用Turtles画出带有花瓣的花
  3. python3.6手册中文版-Python3.6.5标准库 参考文档 完整pdf中文版
  4. python怎么用excel-Python怎么写入excel文件?详细实例在这里。。。
  5. python学习手册中文版免费下载-python学习手册下载|
  6. python安装包-在Python中安装包的三种方法
  7. python可以自学吗-python自学行吗 新手可以自学python吗
  8. python电脑如何下载软件-Python如何下载文件
  9. 如何自学python语言-我是如何学习Python语言?
  10. python好学吗 老程序员-为什么会有程序员不喜欢 Python?