1. 程式人生 > >為什麼在A執行緒中呼叫B執行緒的join方法會導致A執行緒阻塞?

為什麼在A執行緒中呼叫B執行緒的join方法會導致A執行緒阻塞?

觀看原始碼可以瞭解到,Thread的join方法利用的是等待/喚醒機制實現的。join中的程式碼片段:

if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }

A執行緒中呼叫B執行緒的join方法的時候,先獲取當前B執行緒物件的鎖,然後判斷B執行緒是否存活,如果B存活則呼叫wait方法等待,A執行緒進入超時等待狀態,A執行緒釋放鎖,直到B執行緒結束才繼續執行。
一點疑問:

既然A呼叫B執行緒的join,那為什麼A會被阻塞?

因為,A中呼叫B執行緒的join的時候,當前執行的執行緒是A而不是B,這個時候可以這麼理解,把join看成其它方法比如test方法,A呼叫B的test的時候B就是一個普通物件,並不是說B執行緒去執行join方法,還是A執行緒在執行B的join方法,然後再去呼叫wait方法,從而A執行緒進入等待狀態。