JAVA线程的interrupt
如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到InterruptedException异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。
线程A在执行sleep,wait,join时,线程B调用线程A的interrupt方法,的确这一个时候A会有InterruptedException 异常抛出来.
但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。
如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态
,所以线程A不会抛出 InterruptedException,而会一直执行着自己的操作.
当线程A终于执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException.
若没有调用sleep(),wait(),join()这些方法,即没有在线程里自己检查中断状态自己抛出InterruptedException的 话,
那InterruptedException是不会被抛出来的.
具体使用见实例1,实例2。
注意1:当线程A执行到wait(),sleep(),join()时,抛出InterruptedException后,中断状态已经被系统复位了,
线程A调用Thread.interrupted()返回的是false
public static boolean interrupted ()
Returns a boolean
indicating whether the current Thread ( currentThread()
) has a pending interrupt request ( true
) or not (false
). It also has the side-effect of clearing the flag.
Returns
- a
boolean
indicating the interrupt status
public boolean isInterrupted ()
Returns a boolean
indicating whether the receiver has a pending interrupt request (true
) or not ( false
)
Returns
- a
boolean
indicating the interrupt status
线程A正在使用sleep()暂停着: Thread.sleep(100000);
如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用
a.interrupt();
令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例
当在sleep中时 线程被调用interrupt()时,就马上会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程.
2. wait() & interrupt()
线程A调用了wait()进入了等待状态,也可以用interrupt()取消.
不过这时候要小心锁定的问题.线程在进入等待区,会把锁定解除,当对等待中的线程调用interrupt()时
,会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的.
3. join() & interrupt()
当线程以join()等待其他线程结束时,当它被调用interrupt(),它与sleep()时一样, 会马上跳到catch块里.
注意,是对谁调用interrupt()方法,一定是调用被阻塞线程的interrupt方法.如在线程a中调用来线程t.join().
则a会等t执行完后在执行t.join后的代码,当在线程b中调用来 a.interrupt()方法,则会抛出InterruptedException,当然join()也就被取消了。
实例1:
static void interruptDemo()
{
Thread t1=new Thread(new InterruptDemoRunnable(),"first");
Thread t2=new Thread(new InterruptDemoRunnable(t1),"second");
t1.start();
t2.start();
}
class InterruptDemoRunnable implements Runnable
{
long id=0;
static long count=0;
Thread t;
InterruptDemoRunnable()
{
this(null);
}
InterruptDemoRunnable(Thread t)
{
id=count++;
this.t=t;
}
boolean blRun=true;
public void run()
{ int cnt=0;
while(blRun)
{
if(t!=null)
{
if(cnt==2)
{
t.interrupt();
if(t.isInterrupted())
System.out.println("set the thread "+t.getName()+" to be Interrupted");
}
}
else
{
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
System.out.println("First Interrupted when sleep");
System.out.println( "Interrupted is "+Thread.interrupted());//@1
}
try
{
Thread.sleep(1);
}
catch(InterruptedException e)
{
System.out.println("second Interrupted when sleep");
}
}
System.out.println(id+"run"+cnt);
cnt++;
if(cnt==5)
{
blRun=false;
}
}
System.out.println("thread:"+id+"exit");
}
}
注意1:当线程A执行到wait(),sleep(),join()时,抛出InterruptedException后,中断状态已经被系统复位了。
线程AThread.interrupted()返回的是false
实例2:
static void interruptDemo()
{
Thread t1=new InterruptDemoThread();
t1.setName("t1");
Thread t2=new InterruptDemoThread(t1);
t1.setName("t2");
t1.start();
t2.start();
}
class InterruptDemoThread extends Thread
{
long id=0;
static long count=0;
Thread t;
InterruptDemoThread()
{
this(null);
}
InterruptDemoThread(Thread t)
{
id=count++;
this.t=t;
}
boolean blRun=true;
public void run()
{ int cnt=0;
while(blRun)
{
if(t!=null)
{
if(cnt==2)
{
t.interrupt();
if(t.isInterrupted())
System.out.println("set the thread "+t.getName()+" to be Interrupted");
}
}
else if(isInterrupted())@1
{
/*Thread.interrupted();//@2
System.out.println("after interrupted(),the state of Interrupted is "+isInterrupted());*/
try{
Thread.sleep(1);
}
catch(InterruptedException e)
{
System.out.println("Interrupted when sleep");
System.out.println( "Interrupted is "+Thread.interrupted());
}
}
Thread.yield();
System.out.println(id+"run"+cnt);
cnt++;
if(cnt==5)
{
blRun=false;
}
}
System.out.println("thread:"+id+"exit");
}
}
注意1:如果线程被调用了interrupt(),那么如果此次该线程并不在wait(),sleep(),join()时,
下次执行wait(),sleep(),join()时,一样会抛出InterruptedException,当然抛出后该线程的中断状态也回被系统复位。
注意2:我们可以手动的使用Thread.interrupted()来使当前线程的中断状态系统复位(即清除中断状态)
JAVA线程的interrupt相关推荐
- java线程中断 interrupt
1. 线程的状态: new -> 创建完线程,但是还没有启动 runnable -> 表示线程是活跃状态 terminated -> 表示线程已经结束了 线程在sleep的时候是什 ...
- Android Thread interrupt 中断JAVA线程(转)
转载自:http://hi.baidu.com/%E3%C6%CE%C4%B7%E5/blog/item/d8959f1b6716c8168618bfbb.html 假如我们有一个任务如下,交给一个J ...
- Java线程状态及 wait、sleep、join、interrupt、yield等的区别
Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断.被拥有该对象锁的线程唤醒(notify或not ...
- java 线程池 中断_如何中断(interrupt)线程(thread)(线程池的线程中断我的理解是一个意思)...
1.概述基本实现是,通过 InterruptedException 异常来终止程序,至于线程什么时候终止,只能由jvm来决定了,若理解的不到位,欢迎大牛们指点 2.code 如下 package co ...
- 用interrupt()中断Java线程
http://hapinwater.iteye.com/blog/310558 最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程 ...
- java线程interrupt用法_Java 如何中断线程
本篇文章帮大家学习java 如何中断线程,包含了Java 如何中断线程使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 以下实例演示了如何使用interrupt()方法来中 ...
- java线程的中断(interrupt)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等. 所以你看到Thread.suspend, Threa ...
- java线程钥匙_Java多线程并发编程/锁的理解
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...
- java 线程 通过interrupted_Java线程的传说(1)——中断线程Interrupted的用处
中断线程 -- interrupt() 一个正在运行的线程除了正常的时间片中断之外,能否被其他线程控制?或者说其他线程能否让指定线程放弃CPU或者提前结束运行? 除了线程同步机制之外,还有两种方法: ...
最新文章
- 聚焦和增强卷积神经网络
- W ndoWs7重启按F11没用,windows7无法正常启动按F8也没有效果的解决方法
- python笔记:数组的一些操作
- [C++ STL algorithm] lower_bound、upper_bound、unique的本质
- 鼠标跟随事件jQuery
- Atitit 2017年第68界机器视觉图像处理学术大会会议记要attilax总结自建学院自颁学位理论
- html网页做一个打字小游戏,原生js实现的金山打字小游戏(实例代码详解)
- Tomcat日志设置
- Unity3d 局域网小游戏DEMO学习
- 获取网易云榜单列表100首音乐
- macOS配置MAVEN环境变量执行source .bash_profile报错.bash_profile: not valid in this context: /xxx/xxx
- 最小安装CentOS 7.6 Linux系统(无UI界面纯命令行,虚拟机教学)
- WebScoket 读取身份证号码
- 基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)
- HelloRobot【六足】机械蜘蛛
- android调用在线天气服务,android通过google api获取天气信息示例
- 《Hadoop 权威指南 - 大数据的存储与分析》学习笔记
- Linux —— 多线程
- [机器学习]最小估计法和最大似然法证明
- Thebrain12官方正式版来了,Beta拜拜!
热门文章
- [转]一份ASP内存的释放的实验报告
- mysql5.17免安装教程_详细介绍MySql5.7.17免安装配置教程的示例代码
- 光盘显示容量但读不出文件_软网推荐:文件夹容量属性增强显示
- 特效html布局,一些好玩的css特效
- 河南科技大学c语言网络教学平台,计算机基础教学部
- 微策略2011校园招聘笔试题(找出数组中两个只出现一次的数字)
- MVP+WCF+三层结构搭建项目框架(上)
- Python打包之pyinstaller
- 深入grootJs(进阶教程)
- MongoDB应用篇