interrupt

interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。
注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态并做处理。一旦线程的中断状态位被置为“中断”,就会抛出interruptedException异常。

interrupted 和 isInterrupted

interruptted实现:
public static boolean interrupted() {return currentThread().isInterrupted(true);}
该方法就是直接调用当前线程的isInterrupted(true)方法。
isInterrupted实现:
public boolean isInterrupted() {return isInterrupted(false);}
这两个方法有两个主要区别:
  1. interrupted 是作用于当前线程,isInterrupted 是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。)
  2. 这两个方法最终都会调用同一个方法,只不过参数一个是true,一个是false;
第二个区别主要体现在调用的方法的参数上,让我们来看一看这个参数是什么含义
先来看一看被调用的方法 isInterrupted(boolean arg)的定义:
private native boolean isInterrupted(boolean ClearInterrupted);
原来这是一个本地方法,看不到源码。通过参数名我们就能知道,这个参数代表是否要清除状态位。

如果这个参数为true,说明返回线程的状态位后,要清掉原来的状态位。这个参数为false,就是直接返回线程的状态位。

也就是interrupted返回线程的状态位,又清空了状态位。isInterrupted只是返回了线程的状态位

以下程序看这三个方法的区别:

public class ThreadInterruptTest {public static void main(String[] args) {System.out.println("isInterrupted :"  + Thread.currentThread().isInterrupted());//当前线程没有被中断,返回false;Thread.currentThread().interrupt();//中断了该线程,但是该线程仍会继续执行,该方法只是将线程的状态设置成“中断”状态System.out.println("isInterrupted :" + Thread.currentThread().isInterrupted());//interrupt()执行后,线程被设置成中断状态,返回trueSystem.out.println("interrupted :" + Thread.interrupted());//返回了中断状态:true,又清掉了状态位。System.out.println("isInterrupted :" + Thread.currentThread().isInterrupted());//由于interrupted()清掉了状态位,所以返回false;System.out.println("interrupted :" + Thread.interrupted());//返回false}
}

执行结果:

InterruptedException

当一个线程被一些声明了InterruptedException的方法阻塞时,你对这个线程调用Thread.interrupt(),那么大多数这样的方法会立即抛出InterruptedException.如果有些人试着去打断我们的线程,而我们通过捕捉InterruptedException发现了它,这时候最合理的事情就是结束上述被打断的线程(然而大多数时候我们并不处理它)。
public class InterruptedExceptionTest {public static void main(String[] args) throws InterruptedException {ThreadA a = new ThreadA();a.start();Thread.sleep(2000);a.interrupt();System.out.println("a:" + a.isInterrupted());}}class ThreadA extends Thread {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {System.out.println("正在执行");try {Thread.sleep(1000);} catch (InterruptedException e) {//状态位被清除e.printStackTrace();System.out.println("该线程:" + Thread.currentThread().isInterrupted());//由于状态位被清除,返回falseThread.currentThread().interrupt();}}}}

上面的程序中,主线程调用了a线程的interrupt()方法(线程a的状态位被置为"中断"),线程a捕获了InterruptedException后(此时,线程a的“ 中断”状态被清除),调用了Thread.currentThread().interrupt(),线程a的状态被置为“中断”,接着继续执行循环条件,线程是中断状态,跳出了循环,线程最终结束了执行。这里,如果在捕获 InterruptedException后,不将线程的状态置为“中断”,那么循环仍然会执行,并不会结束。

注意一下几点:
  • 捕获InterruptedException之后应该适当地对它进行处理-大多数情况下适当的处理指的是完全地跳出当前任务/循环/线程。
  • 吞掉InterruptedException不是一个好主意
  • 如果线程在非阻塞调用中被打断了,这时应该使用isInterrupted()。当线程早已被打断(也就是被标记为interrupted)时,一旦进入阻塞方法就应该立刻抛出InterruptedException。

interrupt、interrupted 、isInterrupted、InterruptedException相关推荐

  1. 简述Thread的interrupt()、interrupted()及isInterrupted()的区别

    前言 在java Thread类中,我们会看到interrupt().interrupted()及isInterrupted(),在大多数情况下,我们都不会使用到它们,但是有一个Interrupted ...

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

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

  3. JAVA interrupt、interrupted和isInterrupted的区别

    提前总结: interrupt() 向当前调用者线程发出中断信号 isinterrupted() 查看当前中断信号是true还是false interrupted() 是静态方法,查看当前中断信号是t ...

  4. 【Java】interrupt、interrupted和isInterrupted的区别

    今天在看到Thread类的isInterrupted方法可以获取线程的中断状态: 于是写了个例子想验证一下: public class Interrupt {public static void ma ...

  5. 对Java中interrupt、interrupted和isInterrupted的理解

    为什么80%的码农都做不了架构师?>>>    今天在看到Thread类的isInterrupted方法可以获取线程的中断状态: 于是写了个例子想验证一下: public class ...

  6. java---interrupt、interrupted和isInterrupted的区别

    https://www.cnblogs.com/w-wfy/p/6414801.html

  7. 对于interrupt,interrupted 和 isInterrupted的一些理解

    为什么interrupt,isInterrupted是实例方法,而interrupted是类方法? 原因: interrupt的语义 是:中断一个线程.线程可以在其内部调用this.interrupt ...

  8. java isinterrupted_JAVA多线程之中断机制stop()、interrupted()、isInterrupted()

    一,介绍 本文记录JAVA多线程中的中断机制的一些知识点.主要是stop方法.interrupted()与isInterrupted()方法的区别,并从源代码的实现上进行简单分析. JAVA中有3种方 ...

  9. java isinterrupted_JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())

    一,介绍 本文记录JAVA多线程中的中断机制的一些知识点.主要是stop方法.interrupted()与isInterrupted()方法的区别,并从源代码的实现上进行简单分析. JAVA中有3种方 ...

  10. java中interrupt,interrupted和isInterrupted的区别

    文章目录 isInterrupted interrupted interrupt java中interrupt,interrupted和isInterrupted的区别 前面的文章我们讲到了调用int ...

最新文章

  1. 【硅谷牛仔】Facebook最初的CEO肖恩帕克
  2. 两步设置:visual studio code(vscode)如何设置文本自动换行
  3. Java内部具有原子更新的动态热交换环境
  4. 工作失职的处理决定_工作失职的处理决定
  5. Java并发编程-ConcurrentHashMap
  6. 随想录(386cpu保护模式)
  7. [深入Maven源代码]maven绑定命令行参数到具体插件
  8. 大学计算机ps教程 pdf,ps学习photoshop新手教程(珍藏版).pdf
  9. 安卓手机怎么运行java?如何在Android手机上运行jAVA程序?
  10. 转:模拟信号隔离法则
  11. Sum of the Line UPC5222 (容斥)
  12. [NLP] 秒懂词向量Word2vec的本质+word2vec资源总结
  13. 12位串行AD转换器TLC2543与单片机的接口设计与编程
  14. curl 错误:unable to verify the first certificate 解决办法
  15. HTML图片和多行文字并列显示
  16. 摩托罗拉ap6521恢复出厂_moto AP6521 配置命令
  17. 最新出炉 csdn最牛最全JMeter+Ant+Jenkins接口自动化测试框架(Windows)
  18. 可以放GOOGLE广告的博客总汇
  19. 动漫剪纸可爱粉星空专用PPT模板分享
  20. jzoj4684. 【GDOI2017模拟8.11】卡牌游戏

热门文章

  1. 大数据预测:未来最吸金的领域
  2. 递归、迭代和分治(1):递归
  3. 单片机:看门狗程序简介
  4. 以周一为每周的第一天,计算周数
  5. C++:未定义引用静态类成员?
  6. 3D中的OBJ文件格式详解(转)
  7. ibm服务器密码破解_IBM Integration Bus中的密码术操作
  8. 疫情之后,SaaS的春天就来了吗?
  9. oracle 导出 数据库
  10. 关于协方差,协方差矩阵的个人理解