一、前言
如果子线程执行完毕终止状态,主线程再去调用interrupt()有什么效果?如果子线程还在执行过程中,主线程调用interrupt()有什么结果?
二、模拟实验
1、模拟子线程执行完毕再调用interrupt()
public class Test {
public static void main(String[] args) throws InterruptedException {
test2();
}
private static void test2() throws InterruptedException {
Thread thread = new Thread(() -> {
try {
log.info("1前{}", Thread.currentThread().getName());
// 导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,这取决于系统计时器和调度器
// 的准确与精密。线程不会丢失任何监视器的所有权。
Thread.sleep(2000);
log.info("1后{}", Thread.currentThread().getName());
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
log.info("2前{}", Thread.currentThread().getName());
thread.start();
log.info("2后{}", Thread.currentThread().getName());
// 1子线程2000主3000则子线程执行完毕再中断正常false,2子线程2000主1000中断子线程响应异常true
Thread.sleep(3000);
log.info("3后{}", Thread.currentThread().getName());
log.info("interrupted........................");
thread.interrupt();
log.info("中断标志{}", thread.isInterrupted());
}
}
运行结果:
可见:
- 主线程调用start()启动子线程,主线程睡眠3秒。
- 子线程获取到CPU调度资源,开始执行打印日志,然后睡眠2秒(在这过程中主线程依然睡眠),2秒过后子线程醒来继续执行打印日志,执行完毕那么按照线程的生命周期子线程的状态就是终止状态了。(它是不会往下执行的,作用域?)
- 3秒后主线程醒来,打算中断子线程,但是打印中断标志为false。那么子线程执行完毕终止状态,再去(调用interrupt())中断它是无法完成的,isInterrupted()返回false
2、模拟子线程未执行完毕就调用interrupt()
public class Test {
public static void main(String[] args) throws InterruptedException {
test2();
}
private static void test2() throws InterruptedException {
Thread thread = new Thread(() -> {
try {
log.info("1前{}", Thread.currentThread().getName());
// 导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,这取决于系统计时器和调度器
// 的准确与精密。线程不会丢失任何监视器的所有权。
Thread.sleep(2000);
log.info("1后{}", Thread.currentThread().getName());
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
log.info("2前{}", Thread.currentThread().getName());
thread.start();
log.info("2后{}", Thread.currentThread().getName());
// 1子线程2000主3000则子线程执行完毕再中断正常false,2子线程2000主1000中断子线程响应异常true
Thread.sleep(1000);
log.info("3后{}", Thread.currentThread().getName());
log.info("interrupted........................");
thread.interrupt();
log.info("中断标志{}", thread.isInterrupted());
}
}
运行结果:
可见:
- 主线程调用start()启动子线程,主线程睡眠1秒。
- 子线程获取到CPU调度资源,开始执行打印日志,然后睡眠2秒(在这过程中主线程醒来了)
- 主线程醒来打印日志,调用thread.interrupt()中断子线程,thread.isInterrupted()返回true
- 子线程响应中断,抛出中断异常