执行interrupted()后park()失效的问题

GechangLiu 2020-03-29 03:06:55
先执行interrupted()方法可以得到预期结果,线程的中断标记被清空,park()可以正常阻塞线程
    private static void test4() {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
log.debug("park...");
LockSupport.park();
log.debug("打断状态:{}", Thread.interrupted());
log.debug("打断状态:{}", Thread.currentThread().isInterrupted());
}
});
t1.start();


sleep(1);
t1.interrupt();
}

运行结果
14:59:59.983 c.TestInterrupt [Thread-0] - park...
15:00:00.982 c.TestInterrupt [Thread-0] - 打断状态:true
15:00:00.983 c.TestInterrupt [Thread-0] - 打断状态:false
15:00:00.983 c.TestInterrupt [Thread-0] - park...

如果是先运行isInterrupted()方法,那么park()需要到下次interrupted()的时候才会阻塞线程
    private static void test4() {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
log.debug("park...");
LockSupport.park();
log.debug("打断状态:{}", Thread.currentThread().isInterrupted());
log.debug("打断状态:{}", Thread.interrupted());
}
});
t1.start();


sleep(1);
t1.interrupt();
}


运行结果
15:05:34.855 c.TestInterrupt [Thread-0] - park...
15:05:35.853 c.TestInterrupt [Thread-0] - 打断状态:true
15:05:35.854 c.TestInterrupt [Thread-0] - 打断状态:true
15:05:35.855 c.TestInterrupt [Thread-0] - park...
15:05:35.855 c.TestInterrupt [Thread-0] - 打断状态:false
15:05:35.855 c.TestInterrupt [Thread-0] - 打断状态:false
15:05:35.855 c.TestInterrupt [Thread-0] - park...

...全文
185 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
编程菜农 2021-08-03
  • 打赏
  • 举报
回复 1

interrupt() 改变了标志位,Thread.interrupted()静态方法会得到标志位同时置标志位为false,而成员方法的interrupted()并不会置回false;park在中断标志位为true的时候是失效的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧