①. 什么是中断

①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了

②. 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制 — 中断

③. 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现

④. 若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设为true

⑤. 每个线程对象中都有一个标识,用于标识线程是否被中断;该标识位为true表示中断,为false表示未中断,通过调用线程对象的interrupt方法将线程的标识位设为true,可以在别的线程中调用,也可以在自己的线程中调用

②. 源码解读(中断的相关API)

①. void interrupt( )实例方法

interrupt( )仅仅是设置线程的中断状态为true,不会停止线程

源码解读
(如果这个线程因为wait()、join()、sleep()方法在用的过程中被打断(interupt),会抛出Interrupte dException)

②. boolean isInterrupted( )实例方法

判断当前线程是否被中断(通过检查中断标识位) 实例方法

③. static boolean interrupted( )静态方法

 判断线程是否被中断,并清楚当前中断状态,这个方法做了两件事
 第一件事 返回当前线程的中断状态

第二件事 将当前线程的中断状态设为false

原理:假设有两个线程A、B,线程B调用了interrupt方法,这个时候我们连续调用两次isInterrupted方法,第一次会返回true,然后这个方法会将中断标识位设置位false,所以第二次调用将返回false

④. 比较静态方法interrupted和实例方法isInterrupted

  1. 静态方法interrupted将会清除中断状态(传入的参数ClearInterrupted位true)
  2. 实例方法isInterrupted则不会(传入的参数ClearInterrupted为false)

③. 如何使用中断标识停止线程

  • ①. 在需要中断的线程中不断监听中断状态,一旦发生中断,就执行型对于的中断处理业务逻辑

  • ②. 三种中断标识停止线程的方式

  1. 通过一个volatile变量实现
  2. 通过AtomicBoolean
  3. 通过Thread类自带的中断API方法实现
public class InterruptDemo{static volatile boolean isStop = false;static AtomicBoolean atomicBoolean = new AtomicBoolean(false);public static void m3(){Thread t1 = new Thread(() -> {while (true) {if (Thread.currentThread().isInterrupted()) {System.out.println("-----isInterrupted() = true,程序结束。");break;}System.out.println("------hello Interrupt");}}, "t1");t1.start();try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }new Thread(() -> {t1.interrupt();//修改t1线程的中断标志位为true},"t2").start();
}/*** 通过AtomicBoolean*/public static void m2(){new Thread(() -> {while(true){if(atomicBoolean.get()){System.out.println("-----atomicBoolean.get() = true,程序结束。");break;}System.out.println("------hello atomicBoolean");}},"t1").start();//暂停几秒钟线程try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }new Thread(() -> {atomicBoolean.set(true);},"t2").start();}/*** 通过一个volatile变量实现*/public static void m1(){new Thread(() -> {while(true){if(isStop){System.out.println("-----isStop = true,程序结束。");break;}System.out.println("------hello isStop");}},"t1").start();//暂停几秒钟线程try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }new Thread(() -> {isStop = true;},"t2").start();}
}

③. 当前线程的中断标识为true,是不是就立刻停止?

1、线程调用interrupt()时
①. 如果线程处于正常活动状态,那么会将线程的中断标志设置位true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。所以,interrupt( )并不能真正的中断线程,需要被调用的线程自己进行配合才行

②. 如果线程处于被阻塞状态(例如处于sleep、wait、join等状态),在别的线程中调用当前线程对象的interrupt方法,那么线程立即被阻塞状态,并抛出一个InterruptedException异常)

2、中断只是一种协同机制,修改中断标识位仅此而已,不是立即stop打断

 3 、sleep、wait 等方法抛出InterruptedException后,中断标识也被清空置为false,我们在catch没有通过调用th.interrupt( )方法再次将中断标识位设置位true,这就是导致无限循环了

总结

/*** 1 中断标志位,默认false* 2 t2 ----> t1发出了中断协商,t2调用t1.interrupt(),中断标志位true* 3 中断标志位true,正常情况,程序停止,^_^* 4 中断标志位true,异常情况, 就是t1过程中调用了sleep 、join 、 wait 方法 会抛出一个 InterruptedException(中断异常),* 将会把中断状态将被清除,并且将收到InterruptedException 。中断标志位重新设置为false 导致无限循环** 5 所以如果要线程中调用sleep 、join 、 wait 方法 需要在catch块中,需要再次给中断标志位设置为true,2次调用停止程序才OK*/
package com.bilibili.juc.interrupt;import java.util.concurrent.TimeUnit;/*** @auther zzyy* @create 2022-01-20 10:52*/
public class InterruptDemo3
{public static void main(String[] args){Thread t1 = new Thread(() -> {while (true){if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"\t " +"中断标志位:"+Thread.currentThread().isInterrupted()+" 程序停止");break;}try {Thread.sleep(200);} catch (InterruptedException e) {Thread.currentThread().interrupt();//为什么要在异常处,再调用一次??e.printStackTrace();}System.out.println("-----hello InterruptDemo3");}}, "t1");t1.start();//暂停几秒钟线程try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }new Thread(() -> t1.interrupt(),"t2").start();}
}/*** 1 中断标志位,默认false* 2 t2 ----> t1发出了中断协商,t2调用t1.interrupt(),中断标志位true* 3 中断标志位true,正常情况,程序停止,^_^* 4 中断标志位true,异常情况, 就是t1过程中调用了sleep 、join 、 wait 方法 会抛出一个 InterruptedException(中断异常),* 将会把中断状态将被清除,并且将收到InterruptedException 。中断标志位重新设置为false 导致无限循环** 5 所以如果要线程中调用sleep 、join 、 wait 方法 需要在catch块中,需要再次给中断标志位设置为true,2次调用停止程序才OK*/

参考博客

Juc22_什么是中断、interrupt、isInterrupted、interrupted方法源码解析、如何使用中断标识停止线程_所得皆惊喜的博客-CSDN博客_线程中断标识文章目录①. 什么是中断②. 源码解读(中断的相关API)③. 如何使用中断标识停止线程①. 什么是中断①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了②. 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制 — 中断③. 中断只是一种协作机制,Java没有给中断增加任何语法,中断的https://blog.csdn.net/TZ845195485/article/details/118404232

线程中断机制 interrupt、isInterrupted、interrupted方法相关推荐

  1. 线程中断的三个方法的区别(interrupt/isInterrupted/interrupted)

    线程中断的三个方法的区别(interrupt/isInterrupted/interrupted)-总结自Java编程之美 方法定义 void interrupt():中断调用该方法的实例线程对象.当 ...

  2. 怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?

    怎么查看线程状态 jps指令查看我当前的进程ID jstack 线程ID 示例: public class StatusDemo {public static void main(String[] a ...

  3. thinkinjava21.4.4----java中interrupt和interrupted方法的使用和线程退出的时机

    对thinkinjava的21章4.4节检查中断的例子的解释. 当你在线程上调用interrupt()时,线程中断发生的唯一时刻是在任务要进入到可中断的阻塞操作(如sleep,wait, join等) ...

  4. java 线程 通过interrupted_分析Java线程中断机制stop和interrupted的用法

    1.引言当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时--都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法来停 ...

  5. JAVA多线程终止线程、退出线程、Interrupt()方法、苦逼的搬砖工

    方式一: 设置标志位退出 public class Interrupt1 {public static void main(String[] args) throws InterruptedExcep ...

  6. java线程 stop()_java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())...

    JAVA中有3种方式可以终止正在运行的线程 ①线程正常退出,即run()方法执行完毕了 ②使用Thread类中的stop()方法强行终止线程.但stop()方法已经过期了,不推荐使用 ③使用中断机制i ...

  7. Java线程中断机制-如何中断线程

    Java线程中断机制-如何中断线程 版权声明:本文为博主原创文章,欢迎指正或者转载. https://blog.csdn.net/qq_38663729/article/details/7823264 ...

  8. 线程中断标志位 interrupt()、interrupted()、isInterrupted() 的认识

    常见问题 首先你是怎么去关闭一个开启的线程.调用中断方法之后,线程就立即停止运行吗? 带着这两个问题探讨一下,主要围绕着这三个方法讲述: interrupt().interrupted().isInt ...

  9. 多线程之 interrupt,interrupted,isInterrupted 方法区别

    首先看测试代码 /** * Created by Jarvis.y on 2020/11/5 * <p> * interrupt , interrupted , isInterrupted ...

最新文章

  1. 安装Termux的手机上运行Python
  2. 三步搞定 opencv 初始环境设定
  3. 就是这么流弊!三行Python代码,让数据处理速度提高2到6倍
  4. flash写保护原理_为什么固态会掉盘?著名的30分钟大法修复是什么原理?
  5. 他不怕被拒绝_不怕被拒绝,这几大星座男追人时最有耐心
  6. 关于android MTK相机L版本,切换屏幕比例后,分辨率随之改变,但重新进入相机后原有分辨率不再生效问题...
  7. javaScript数据类型转换—显式转换(二)
  8. Windows程序设计与C语言的主要区别是什么?
  9. Java线程状态及其转移
  10. TOM邮箱怎么样 TOM邮箱品牌测评分析
  11. 制备a-CN_x、CrN、TiCN、TiAlN碳氮化物薄膜-供应锡硫化物薄膜 硫化亚锡(SnS)薄膜 电沉积硫化亚锡(SnS)薄膜 硫化亚锡(SnS)异质结薄膜 简易硫化亚锡(SnS)微米棒薄膜
  12. SAP SD发货流程中托盘的管理
  13. linux根据修改日期删除,在Linux下怎么一次性删除掉那些修改时间为指定日期的所有文件?...
  14. 摄像头取流转发 嵌入式系统_如何在不转发的情况下嵌入某人的Twitter视频
  15. php 电梯程序,干货:电梯调试流程内容!
  16. anaconda下安装pytorch超详细步骤(有问题可以在评论区提问会及时解答)
  17. iphone文件app里无法连接服务器,苹果商店怎么打不开 无法连接到app store解决方法...
  18. 通用 Mapper 4.0.0 版本发布
  19. C# Buffer.BlockCopy方法详解
  20. OpenGL二次曲面绘制

热门文章

  1. 【Latex系列】表格绘制
  2. 用c语言编程等比数列,C语言求等比数列2的0次方,2的1次方,2的2次方,...,2的63次方前64项的和....
  3. 树莓派4b安装miniconda
  4. python基础语法(六)
  5. 天锋w2019_天锋W2019完美还原三星W2019 外观做工真假难辨
  6. Linux查询进程指令
  7. 手机拍照翻译怎么操作?手机拍照翻译app哪个好用?
  8. java下载文件0kb_【java】File的使用:将字符串写出到本地文件,大小0kb的原因
  9. ORACLE这门武功
  10. jvm之java内存区域详解篇guide哥yyds