文章目录

  • isInterrupted
  • interrupted
  • interrupt

java中interrupt,interrupted和isInterrupted的区别

前面的文章我们讲到了调用interrupt()来停止一个Thread,本文将会详细讲解java中三个非常相似的方法interrupt,interrupted和isInterrupted。

isInterrupted

首先看下最简单的isInterrupted方法。isInterrupted是Thread类中的一个实例方法:

    public boolean isInterrupted() {return isInterrupted(false);}

通过调用isInterrupted()可以判断实例线程是否被中断。

它的内部调用了isInterrupted(false)方法:

  /*** Tests if some Thread has been interrupted.  The interrupted state* is reset or not based on the value of ClearInterrupted that is* passed.*/private native boolean isInterrupted(boolean ClearInterrupted);

这个方法是个native方法,接收一个是否清除Interrupted标志位的参数。

我们可以看到isInterrupted()传入的参数是false,这就表示isInterrupted()只会判断是否被中断,而不会清除中断状态。

interrupted

interrupted是Thread中的一个类方法:

 public static boolean interrupted() {return currentThread().isInterrupted(true);}

我们可以看到,interrupted()也调用了isInterrupted(true)方法,不过它传递的参数是true,表示将会清除中断标志位。

注意,因为interrupted()是一个类方法,调用isInterrupted(true)判断的是当前线程是否被中断。注意这里currentThread()的使用。

interrupt

前面两个是判断是否中断的方法,而interrupt()就是真正触发中断的方法。

我们先看下interrupt的定义:

    public void interrupt() {if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0();           // Just to set the interrupt flagb.interrupt(this);return;}}interrupt0();}

从定义我们可以看到interrupt()是一个实例方法。

它的工作要点有下面4点:

  1. 如果当前线程实例在调用Object类的wait(),wait(long)或wait(long,int)方法或join(),join(long),join(long,int)方法,或者在该实例中调用了Thread.sleep(long)或Thread.sleep(long,int)方法,并且正在阻塞状态中时,则其中断状态将被清除,并将收到InterruptedException。

  2. 如果此线程在InterruptibleChannel上的I / O操作中处于被阻塞状态,则该channel将被关闭,该线程的中断状态将被设置为true,并且该线程将收到java.nio.channels.ClosedByInterruptException异常。

  3. 如果此线程在java.nio.channels.Selector中处于被被阻塞状态,则将设置该线程的中断状态为true,并且它将立即从select操作中返回。

  4. 如果上面的情况都不成立,则设置中断状态为true。

我们来举个例子:

@Slf4j
public class InterruptThread extends Thread {@Overridepublic  void run() {for (int i = 0; i < 1000; i++) {log.info("i= {}", (i+1));log.info("call inside thread.interrupted(): {}", Thread.interrupted());}}@Testpublic void testInterrupt(){InterruptThread thread=new InterruptThread();thread.start();thread.interrupt();//test isInterruptedlog.info("first call isInterrupted(): {}", thread.isInterrupted());log.info("second call isInterrupted(): {}", thread.isInterrupted());//test interrupted()log.info("first call outside thread.interrupted(): {}", Thread.interrupted());log.info("second call outside thread.interrupted() {}:", Thread.interrupted());log.info("thread is alive : {}",thread.isAlive() );}
}

输出结果如下:

13:07:17.804 [main] INFO com.flydean.InterruptThread - first call isInterrupted(): true
13:07:17.808 [main] INFO com.flydean.InterruptThread - second call isInterrupted(): true13:07:17.808 [Thread-1] INFO com.flydean.InterruptThread - call inside thread.interrupted(): true
13:07:17.808 [Thread-1] INFO com.flydean.InterruptThread - call inside thread.interrupted(): false13:07:17.808 [main] INFO com.flydean.InterruptThread - first call outside thread.interrupted(): false
13:07:17.809 [main] INFO com.flydean.InterruptThread - second call outside thread.interrupted() false

上面的例子中,两次调用thread.isInterrupted()的值都是true。

在线程内部调用Thread.interrupted(), 只有第一次返回的是ture,后面返回的都是false,这表明第一次被重置了。

在线程外部,因为并没有中断外部线程,所以返回的值一直都是false。

本文的例子参考https://github.com/ddean2009/learn-java-concurrency/tree/master/interrupt

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多教程请参考 flydean的博客

java中interrupt,interrupted和isInterrupted的区别相关推荐

  1. Thread中interrupt()interrupted()和isInterrupted()的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在java线程中,线程的状态分为6种.官方文档的解释是: /*** Thread state for a thread whi ...

  2. 【JAVA多线程】interrupted() 和 isInterrupted() 的区别

    Thread 类中提供了两种方法用来判断线程的状态是不是停止的.就是我们今天的两位主人公 interrupted() 和 isInterrupted() . interrupted() 官方解释:测试 ...

  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. 简述Thread的interrupt()、interrupted()及isInterrupted()的区别

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

  7. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...

  8. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  9. Java中PreparedStatement和Statement的用法区别

    Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Sta ...

最新文章

  1. Oracle根据日期区间查询Date类型的数据
  2. 【c语言】数组逆序排列
  3. 关于几种压缩算法以及hadoop和hbase中的压缩配置说明
  4. Mybatis接口Mapper内的方法为啥不能重载吗?
  5. linux数据污点标记,Taints和Tolerations(污点和容忍)
  6. 很长很真实!但会对你有所帮助的(关于职业规划)
  7. 锻炼产品架构思维的4个维度
  8. qscrollbar 固定滑块大小_第32章:五金冲压模具设计:通用滑块结构形式!新手必备资料!...
  9. 小苏的Shell编程笔记之六--Shell中的函数
  10. U-boot移植方法
  11. 字符串算法 金策_国家集训队论文(较全)
  12. xshell安装教程
  13. sumifs两个求和列如何计算_「sumifs」多条件求和函数Sumifs的用法 - seo实验室
  14. 贴片电阻封装规格及阻值标注方法
  15. gmap 支持python吗_Python:地图上的标记标签使用gmap.marker_层使用hover_-tex选项不工作...
  16. Formal Verification (三) abstraction strategy、reduce complexity for convergence
  17. pdf怎么插入页码步骤介绍
  18. 【黑灰产犯罪研究】涉物联网犯罪
  19. Arty A7-100(XC7A100TCSG324)开箱照
  20. 【历史上的今天】8 月 8 日:中国第一个校园 BBS 成立;网景通信上市;EarthLink 创始人出生

热门文章

  1. Windows下Anaconda3安装及使用教程
  2. NKU两题简单题解析(递归分析与位运算技巧)
  3. Lua 语言中的点、冒号与self
  4. PostgreSQL学习笔记5之函数和操作符一
  5. 关于寻路算法的一些思考(5):处理移动中的障碍物
  6. ADO学习(一)基础理论
  7. 没登录网页也能个性化推荐?一文详解浏览器指纹
  8. Notepad++ 去除CRLF符号
  9. 深入理解RCU|核心原理
  10. SpringSecurity + JWT,从入门到精通!