当前位置: 首页 > news >正文

Java thread的Interrupt, isInterrupt, interrupted

转自:http://jay-kid.iteye.com/blog/557064

在《Java网络编程》上看到一个例子, 说是用thread.interrupt()去关闭在等待的线程。不太明白,于是去查了一下Java的API。 

有兴趣的同行们可以先看看API的内容,再看以下总结:

 

1. thread.isInterrupt()和Thread.interrupted()都返回当前线程interrupt的状态

  • thread.isInterrupt()是非静态函数,作用目标是“线程实例”,一般用法如下,
Java代码    收藏代码
  1. TestInterrupt t = new TestInterrupt();  
  2. t.start();  
  3. System.out.println(t.isInterrupt());  

 

  • 而Thread.interrupted()是静态函数,作用目标是“当前线程”
Java代码    收藏代码
  1. System.out.println(Thread.interrupted());  

 并且它会把当前线程的interrupt状态“复位”,假设当前线程的isInterrupt状态为true,它会返回true,但过后isInterrupt的状态会复位为false。之后调用(Thread)t.isInterrupt或Thread.interrupted都会返回false

 

 

2. interrupt()被调用后有几个可能,下面挑几种常见的归类一下:

 

线程阻塞的情况下:

  • 如果线程在调用 Object 类的 wait()wait(long) 或 wait(long, int) 方法,或者该类的join()join(long)join(long, int)sleep(long) 或 sleep(long, int) 方法过程中受阻,则其isInterrupt状态将被清除,设成false, 它还将收到一个InterruptedException.
Java代码    收藏代码
  1. public void run() {  
  2.   
  3.     while (!Thread.currentThread().isInterrupted()) {  
  4.         try{  
  5.             Thread.sleep(1000);  
  6.         } catch (InterruptedException ie){  
  7.             ie.printStackTrace();  
  8.         }  
  9.     }  
  10. }  

 如上所示,如果线程运行到Thread.sleep(1000)时,被其他线调用了该线程的interrupt()的方法,它将会进入catch的段落里面,然后再运行while (!Thread.currentThread().isInterrupted()) 时退出run, 线程被销毁。

 

  • 如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的isInterrupt状态将被设置成true, 并且该线程将收到一个 ClosedByInterruptException。 

 

 

线程正常运行的情况下:

  •  该线程不受影响,继续运行,但该线程的isInterrupt状态将被设置成true
Java代码    收藏代码
  1. public void run() {  
  2.   
  3.     while (!Thread.currentThread().isInterrupted()) {  
  4.         try{  
  5.             //A: 无阻塞的代码.......  
  6.             ......  
  7.             //B: 被调用interrupt.......  
  8.             ......  
  9.             //C: 无阻塞的代码.......  
  10.         } catch (InterruptedException ie){  
  11.             ie.printStackTrace();  
  12.         }  
  13.     }  
  14. }  

 如上所示, 当线程正常运行时,在运行到B点时被调用了interrupt(), 此时该线程将继续正常运行,但isInterrupt的状态会被设为true,当做完 A,B,C的代码时,再进入while (!Thread.currentThread().isInterrupted()) 时,该线程被销毁。假如while的检查条件改为(true),该线程不会受影响,将会一直运行下去。

相关文章:

  • Java字符串
  • Java集合的Stack、Queue、Map的遍历
  • Java正则表达式应用总结
  • javascript的基础知识整理
  • 运行Java应用必须通过main()方法吗?
  • struts2标签库详解
  • Servlet技术总结
  • 深入研究servlet的线程安全问题
  • win10下 Edge和IE浏览器都不能上网,而其他浏览器可以。怎么办?
  • Servlet过滤器机制分析及应用
  • MySQL: Table 'mysql.plugin' doesn't exist的解决
  • Servlet常用过滤器
  • Unity3D静态AI自动寻路
  • Servlet 工作原理解析
  • 初次安装Nodejs,npm,express遇见的问题
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 2019.2.20 c++ 知识梳理
  • Android框架之Volley
  • flutter的key在widget list的作用以及必要性
  • javascript面向对象之创建对象
  • JavaScript设计模式与开发实践系列之策略模式
  • java概述
  • js 实现textarea输入字数提示
  • js面向对象
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Magento 1.x 中文订单打印乱码
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PhantomJS 安装
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • scala基础语法(二)
  • SQLServer插入数据
  • windows下使用nginx调试简介
  • 产品三维模型在线预览
  • 从零搭建Koa2 Server
  • 理解在java “”i=i++;”所发生的事情
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 如何编写一个可升级的智能合约
  • 使用API自动生成工具优化前端工作流
  • 思否第一天
  • 听说你叫Java(二)–Servlet请求
  • 微服务核心架构梳理
  • 线性表及其算法(java实现)
  • 再次简单明了总结flex布局,一看就懂...
  • 正则表达式
  • 交换综合实验一
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​【已解决】npm install​卡主不动的情况
  • ​如何防止网络攻击?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ###项目技术发展史
  • $(function(){})与(function($){....})(jQuery)的区别
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机