什么是中断

Java的一种机制,用于一个线程去暂停另一个线程的运行。就是一个正在运行的线程被其他线程给打断,停止运行挂起了。

我觉得,在Java中,这种中断机制只是一种方便程序员编写进程间的通信罢了。

如何中断

  • interrupt()
    其他线程调用这一线程的这一方法来对其进程中断。
  • isInterrupted()
    当前线程通过这个方法来判断自己是否被中断了。
  • interrupted()
    调用静态方法对当前线程的中断标识进行复位

中断实现原理

中断的执行流程逻辑需要程序员自己完成。

  • 每个线程对象都具有一个中断标识属性,用于表示该线程是否被中断了,ture代表中断,false代表没有中断。
  • 通过调用目标线程的interrupt()方法将该线程的中断表示设置为true;可以由任意线程调用。
  • 被中断线程不断通过条用interrupted() 方法判断自己是不是被中断了,如果被中断了,执行何种逻辑需要程序员自己完成。

中断使用

如果需要使用中断,那么被中断的线程得不断监听中断状态,如果状态发生改变,就执行相应的处理逻辑。

设置中断监听

Thread t1 = new Thread( new Runnable(){
public void run(){
// 若未发生中断,就正常执行任务
while(!Thread.currentThread.isInterrupted()){
// 正常任务代码
} // 中断的处理代码
doSomething();
}
} ).start();

触发中断

t1.interrupt();

可以有当前线程调用,也可以由其他线程调用。

安全停止线程

过时了的stop方法过于暴力,它虽然能够立即停止线程,但是不能保证线程能够正常释放资源,没给机会。所以需要安全地停止线程,有其他方法。

循环中断方法

已经在上面介绍

循环标记变量

自定义一个共享地Boolean类型用于表示线程是否需要中断。

volatile boolean interrupted = false;

Thread t1 = new Thread( new Runnable(){
public void run(){
while(!interrupted){
// 正常任务代码……
}
// 中断处理代码……
// 可以在这里进行资源的释放等操作……
}
} ); // 中断函数
Thread t2 = new Thread( new Runnable(){
public void run(){
interrupted = true;
}
} );

总结

其实上述两种方法本质都是一样的,都是通过一个标志位来实现进程间的通信,在线程可控可见的方式下,友好地暂停对方,这样就可以在程序员可控的地方释放资源什么的。

处理中断

当线程接受到中断信号,需要如何处理。

  • 如果目标线程运行太久了,不想等待了,就用其他线程去中断它。
  • 当你在某一条线程中调用这些方法时,这个方法可能会被阻塞很长时间,你可以在别的线程中调用当前线程对象的interrupt方法触发这些函数抛出InterruptedException异常。
  • 当你捕获到InterruptedException异常后,当前线程的中断状态已经被修改为false(表示线程未被中断);此时你若能够处理中断,则不用理会该值;但如果你继续向上抛InterruptedException异常,你需要再次调用interrupt方法,将当前线程的中断状态设为true
  • 当捕获到InterruptedException异常的时候,可以处理,也可以向上抛出。
  • 不能忽视InterruptedException异常。

Java并发编程的艺术(六)——中断、安全停止线程的更多相关文章

  1. Java并发编程的艺术(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

  2. Java并发编程的艺术(五)——中断

    什么是中断? 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作.因此,Java提供了一种用于停止线程的机制——中断. 中断只是一种协作机制,Java没有给中断增加任 ...

  3. Java并发编程的艺术笔记(八)——线程池

    一.线程池的主要处理流程 ThreadPoolExecutor执行execute方法分下面4种情况. 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步需要获 ...

  4. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  5. Java并发编程的艺术(三)——volatile

    1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行:但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 ...

  6. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...

  7. java并发编程笔记(六)——AQS

    java并发编程笔记(六)--AQS 使用了Node实现FIFO(first in first out)队列,可以用于构建锁或者其他同步装置的基础框架 利用了一个int类型表示状态 使用方法是继承 子 ...

  8. 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理

    二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...

  9. 读《Java并发编程的艺术》(一)

    离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...

  10. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

随机推荐

  1. 与pandas初相识

    前一阵子有个同事说,他看不懂从kibana上拉下来的日志,但是又想分析一些数据,感觉很头痛,每次都找开发给他整理一下,但是开发也很忙,要数据的频率也略高,那时候正好我跟这位需求方的项目,负责测试工作. ...

  2. linx mysql安装

    文章引用:https://www.cnblogs.com/shizhongyang/p/8464876.html 只做了少量修改,感谢博主 注:未防止混淆,这里都用绝对路径执行命令 除了文件内容中的# ...

  3. springboot同一项目部署多实例

    添加 -Dserver.port=xxxx 将配置文件放在nacos注册中心时,要记得在启动第二个实例记得把原来端口注释掉,如果配置文件在本地就不必注释掉了

  4. 使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。

    一.安装所需要的第三方库 jieba (jieba是优秀的中文分词第三分库) pyecharts (一个优秀的数据可视化库) <三国演义>.txt下载地址(提取码:kist ) 使用pyc ...

  5. 新鲜出炉!阿里Java后端面经,已拿offer!

    前面给大家分享了一篇字节跳动拿下offer的面经,很多小伙伴都私信我说收获很大,感兴趣的朋友可以回头去看看.很多小伙伴还问我有没有其他大厂的面试题分享,这不他来啦,阿里2020春招面试题给大家整理在下 ...

  6. css3系列之linear-gradient() repeating-linear-gradient() 和 radial-gradient() repeating-radial-gradient()

    linear-gradient()  (线性渐变) repeating-linear-gradient()   (重复的线性渐变) radial-gradient()  (镜像渐变) repeatin ...

  7. java多态2

    1 package pet_2; 2 3 public class Pet { 4 private String name; 5 6 public String getName() { 7 retur ...

  8. Java继承的两道实验题目

    设计一个表示二维平面上点的类Point,包含有表示坐标位置的Protect类型的成员变量 获取和设置x和y值的public方法 package classwork_6; public class Po ...

  9. VisualStudio C++使用汇编函数

    Visual Studio编写C++代码使用汇编函数 新建空项目 新建如下源文件 ;test.asm ;测试函数 三个数相加 ;.386 .model flat, c ;public test_ .c ...

  10. 在HTML中调用打开摄像头

    1 <img src="imgs/qr.png" alt=""> 2 <video src=""></vide ...