InterruptedException与interrupt()方法简单说明
InterruptedException在如下场景下会发生,即使用sleep(),wait(),join()方法时

package com.java.test.Interrupted.expection;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
/**
* @Description:
* @Author: Yourheart
* @Create: 2022/10/26 11:01
*/
@Slf4j
public class ThreadTest extends Thread{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package com.java.test.Interrupted.expection;
/**
* @Description:
* @Author: Yourheart
* @Create: 2022/10/26 10:54
*/
public class InterruptedTest {
public static void main(String[] args) throws InterruptedException {
ThreadTest threadTest = new ThreadTest();
threadTest.start();
Thread.sleep(10);
threadTest.interrupt();
Thread.sleep(100);
System.exit(0);
}
}
能够被中断的阻塞为轻量级阻塞,对应的线程状态为WAITING或者TIMED)WAITING
像synchronized不能被中断的阻塞称为重量级阻塞,对应的状态为BLOCKED

线程在创建完成后,会进入RUNNING和READY两种状态,当调用阻塞函数(wait,join,park,sleep)后,线程根据不同的情况进入两种不同的状态,一种是WAITING,另一种是TIMED_WAITING,两者的不同之处在于,前者是无限阻塞,后者的阻塞是有时间限制的
因此thread.interrupt()的真实含义是唤醒轻量级的阻塞
下面给出thread.isInterrupted()和Thread.Interrupted()的区别,前者需要创建对象然后去调用,返回当前线程是否被中断了,只是获取状态值,不会重置线程的状态,后者是静态方法,会清除线程的状态


验证代码
package com.java.test.Interrupted.expection;
import lombok.extern.slf4j.Slf4j;
/**
* @Description
* @Author qiuxie
* @Date 2022/10/26 22:49
*/
@Slf4j
public class UpgradeThread extends Thread {
@Override
public void run() {
int i = 0;
while (true) {
boolean interrupted = isInterrupted();
log.info("中断标记:{}",interrupted);
++i;
if (i > 200) {
// 检查并重置中断标志。
boolean interrupted1 = Thread.interrupted();
log.info("重置中断状态:{}",interrupted1);
interrupted1 = Thread.interrupted();
log.info("重置中断状态:{}",interrupted1);
interrupted = isInterrupted();
log.info("中断标记:{}",interrupted);
break;
}
}
}
}
package com.java.test.Interrupted.expection;
import lombok.extern.slf4j.Slf4j;
/**
* @Description
* @Author qiuxie
* @Date 2022/10/26 22:49
*/
@Slf4j
public class UpgradeTest {
public static void main(String[] args) throws InterruptedException {
UpgradeThread upgradeThread=new UpgradeThread();
upgradeThread.start();
Thread.sleep(10);
upgradeThread.interrupt();
Thread.sleep(7);
log.info("中断状态检查-1:{}",upgradeThread.isInterrupted());
log.info("中断状态检查-2:{}",upgradeThread.isInterrupted());
}
}
浙公网安备 33010602011771号