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!!!!,而且沒有捕獲到例外.
uj5u.com熱心網友回復:
interrupt 實際上會呼叫 interrupt0, interrpt0是一個native方法,會呼叫thread.cpp,thread.cpp會呼叫 os_linux.cpp,里面代碼思路大致就是 獲取到作業系統中對應java的執行緒,然后設定標志位,再設定記憶體屏障,再去unpark執行緒,為什么會去unpark執行緒呢?因為如果是park狀態,你連cpu時間片都分不到,談何執行/通知?因此要unpark 實作執行緒的通信,原始碼截圖如下:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/133661.html
標籤:Java相關
