一個執行緒X可以在其他執行緒Y之上呼叫join()方法,其效果是X等待一段時間直到第二個執行緒Y結束才繼續執行。如果某個執行緒在另一個執行緒t上呼叫t.join(),此執行緒將被掛起,直到目標執行緒t結束才恢復。
也可以在呼叫join()時帶上一個超時引數(單位可以是毫秒,或者毫秒和納秒),這樣如果目標執行緒在這段時間到期時還沒有結束的話,join方法總能返回。
對join方法的呼叫可以被中斷,做法是在呼叫執行緒上呼叫interrupt方法,這時需要用到try-catch語句。——《Java程式設計思想》
呼叫誰(執行緒A)的join方法,就要等誰(A)執行結束。
比喻解析:
一般情況
假如我開車在路上兜風,經過路邊一家店,發現我的朋友在店裡,他說他要跟我一塊兜風(他呼叫的他的join方法),我答應了。不過他點了一杯奶茶,要等一會兒。所以我的車就停在原地了,沒有繼續向前跑。(我要等待它完成)等到他拿到奶茶,上車後,我就繼續向前開。(我繼續執行我的任務)
這裡,我和他都是執行緒,我是執行緒A,他是執行緒B。我的任務是開車兜風,而他的任務是等待奶茶完成。
超時情況
他說要等奶茶做好,我說“我可沒那麼多時間,我給你3分鐘”,他答應了。但是過了3分鐘,他奶茶還是沒好。我不耐煩,就走了(繼續執行我的任務)
打斷情況
他說等奶茶做好就上車,我就在原地等。突然他接到一個電話,他的組長大發雷霆,叫他馬上回公司,他寫的程式碼有問題。然後他對我說“完了,我現在要馬上回公司。對不住啊”(他呼叫了他的interrupt方法)。我罵了一句“艹”,然後繼續向前開(繼續執行我的任務)。他呢,則奶茶都沒來得及拿(他自己的任務也沒完成),就會屁顛屁顛地回公司了。