线程中断
中断api
//返回线程状态位状态 public boolean isInterrupted() //设置线程中断状态位为true public void interrupt() //返回线程中断状态,并清除中断状态 public static boolean interrupted()
不同状态的中断效果
1、NEW和TERMINATED
NEW:还未启动,start
TERMINATED:线程运行结束
效果:并不会设置线程的中断标识位,什么事也不会发生。
2、RUNNABLE
运行状态,不一定所有处于RUNNABLE状态的线程都能获得CPU运行,没有获得cpu时间片的没有真正在运行
效果:只是设置中断状态位,不会让线程实际中断,需要程序自己去判断(增加程序灵活性)。
public void run(){ while(true){ //判断线程是否被中断了 if (Thread.currentThread().isInterrupted()){ System.out.println("exit MyThread"); break; } } }
3、BLOCKED
该状态说明该线程由于竞争某个锁失败被挂在了阻塞队列上
效果:只是设置中断状态位,不会让线程实际中断
4、WAITING和TIMED_WAITING
WAITING:无期限等待知道notify
TIMED_WAITING:等待指定时间
线程运行中由于缺少某个条件而被挂起在某个对象的条件队列上
效果:会抛出一个InterruptedException异常,并清空中断标志位
总结
NEW和TERMINATED对于中断操作几乎是屏蔽的
RUNNABLE和BLOCKED类似,对于中断操作只是设置中断标志位并没有强制终止线程,对于线程的终止权利依然在程序手中。
WAITING/TIMED_WAITING状态下的线程对于中断操作是敏感的,他们会抛出异常并清空中断标志位。
参考:https://www.cnblogs.com/yangming1996/p/7612653.html