Thread.interrupt()为什么可以有unpark()的效果呢?

JAVA道人 2018-10-18 06:05:39

public static void aaa() throws InterruptedException {
Thread t = new Thread(new Runnable() {

@Override
public void run() {
try {
System.out.println("ready!!!");
LockSupport.park();//阻塞
System.out.println("go!!!!");
} catch (Exception e) {
e.printStackTrace();
}

}
});
t.start();// 启动时阻塞
// 3秒后执行发放通行证
Thread.sleep(3000);
t.interrupt();
}


这个鬼程序3秒之后阻塞放开了,打印了下一句的go!!!!,而且没有捕获到异常.
...全文
332 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
xpzLee 2020-02-28
精选
  • 打赏
  • 举报
回复 1
interrupt 实际上会调用 interrupt0, interrpt0是一个native方法,会调用thread.cpp,thread.cpp会调用 os_linux.cpp,里面代码思路大致就是 获取到操作系统中对应java的线程,然后设置标志位,再设置内存屏障,再去unpark线程,为什么会去unpark线程呢?因为如果是park状态,你连cpu时间片都分不到,谈何执行/通知?因此要unpark 实现线程的通信,源码截图如下:

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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