目录
interruput方法
interruput的调用者
interruput为线程的实例方法
由线程对象调用
线程不同状态时interrupt
WAIT/TIMEDWAIT状态
即此线程调用了sleep或wait方法后的状态
-
结束其等待状态
-
被打断的线程抛出interruptedException
同时释放持有的锁 -
被打断的线程结束(转入terminited状态)
RUNNING/RUNNABLE状态
此线程的中断标志位被设置为true
此线程需要使用isInterruputed方法主动进行中断检测
并进行响应
BLOCKED状态
此线程不能做出任何响应
可以在恢复执行后进行检测
Interruput相关的方法
public boolean isInterrupted()
测试此线程是否已中断。线程的中断状态不受此方法的影响。
由于线程在中断时不活动而被忽略的线程中断将通过此方法返回false反映出来。
(此检测中断的方法不重置中断标志位)
(此检测中断的方法由线程实例调用 返回的为此线程实例的中断状态)
public static boolean interrupted()
测试当前线程是否已中断。线程的中断状态通过此方法清除。换句话说,如果要连续两次调用此方法,则第二次调用将返回false (除非当前线程再次中断,在第一次调用清除了其中断状态之后并且在第二次调用检查之前)。
由于线程在中断时不活动而被忽略的线程中断将通过此方法返回false反映出来。
(此检测方法重置中断标志位)
(静态方法 返回的是执行此语句的线程的中断标志位)
public void interrupt()
中断此线程。
除非当前线程正在中断自身 (这始终是允许的),否则将调用此线程的checkAccess方法,这可能会导致引发SecurityException。
如果此线程在对象类的wait(),wait(long) 或wait(long,int) 方法,或join(),join(long),join(long,int),sleep(long) 的调用中被阻止,或者sleep(long,int),这个类的方法,那么它的中断状态将被清除,它将收到一个InterruptedException。
如果此线程在中断通道上的I/O操作中被阻止,则该通道将被关闭,线程的中断状态将被设置,线程将收到一个java.nio.channels.Closeedbyinterruptexception。
如果此线程在java.nio.channels.Selector中被阻止,则线程的中断状态将被设置,并且它将从选择操作中立即返回,可能具有非零值,就像调用选择器的唤醒方法一样。
如果以前的条件都不成立,则将设置该线程的中断状态。
中断一个死亡的线程不会有任何效果。
中断测试
RUNNING状态下的中断测试
public class InterruputTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
while(true){
if(Thread.currentThread().isInterrupted()){//检测中断标志位
System.out.println("检测到中断");//如果收到中断请求 输出
Thread.interrupted();//清除中断标志位
}
}
});
t1.start();
while(true){
Thread.sleep(1000);//每一秒向t1线程发出一次中断请求
t1.interrupt();
}
}
}
主线程每秒向t1线程发出一次中断请求
t1循环检测中断 每检测到中断输出一句"检测到中断请求"
并清楚其中断标志位
BLOCKED状态下的中断测试
public class InterruputTest1 {
static final Object lock = new Object();//锁对象
public static void main(String[] args) {
Thread t1 = new Thread(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}//睡眠 等待主线程拿到锁
synchronized (lock){//t1线程阻塞 等待主线程释放锁
System.out.println("t1线程持有锁");
//主线程结束休眠 退出同步代码块后 t1线程进入同步代码块
if(Thread.currentThread().isInterrupted())
System.out.println("t1线程收到中断请求");//如果正确收到了中断请求 输出
}
});
t1.start();
synchronized (lock){
System.out.println("主线程持有锁");
try {
Thread.sleep(2000);//睡眠 等待子线程进入阻塞状态
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.interrupt();//打断阻塞状态中的t1线程
System.out.println("主线程:t1.interrupt()");
System.out.println("主线程释放锁");
}
}
}
在阻塞期间收到中断请求不会做出反应
但可以在恢复执行后进行主动检测并响应
WAITING/TIMEEDWAITING状态下的中断测试
public class InterruptTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
System.out.println("t1线程启动");
System.out.println("t1线程休眠");
try {
Thread.sleep(5000);
} catch (InterruptedException e)/*捕捉InterruptedException*/ {
System.out.println("t1收到中断请求 抛出异常");
e.printStackTrace();
}
});
t1.start();
System.out.println("主线程启动");
Thread.sleep(500);//等待t1线程进入休眠
System.out.println("主线程:t1.interrupt()");
t1.interrupt();
Thread.sleep(500);//等待t1线程抛出异常
System.out.println("主线程:检测t1线程当前状态为"+t1.getState());
}
}
t1线程在waiting状态收到中断请求 抛出异常后进入TERMINITED状态