1. 程式人生 > >執行緒join()方法join的含義

執行緒join()方法join的含義

一直搞不明白Java執行緒裡的join()方法。API給出的解釋是:

Waits for this thread to die.

那你為啥不叫die()或者waitToDie()或者blockOtherThread()? join明明是參加、結合的意思嘛。

一直苦悶了很久。

今天查知乎後終於明白了!

fork/join


一語驚醒夢中人!!!

命名來源於posix標準。子執行緒join到主執行緒(啟動程式的執行緒,比如c語言執行main函式的執行緒)。你的問題可能在於沒有理解join,阻塞執行緒僅僅是一個表現,而非目的。其目的是等待當前執行緒執行完畢後,”計算單元”與主執行緒匯合。即主執行緒與子執行緒匯合之意。


main是主執行緒,在main中建立了thread執行緒,在main中呼叫了thread.join(),那麼等thread結束後再執行main程式碼。

在很多情況下,主執行緒生成並起動了子執行緒,如果子執行緒裡要進行大量的耗時的運算,主執行緒往往將於子執行緒之前結束,但是如果主執行緒處理完其他的事務後,需要用到子執行緒的處理結果,也就是主執行緒需要等待子執行緒執行完成之後再結束,這個時候就要用到join()方法了。

在網上看到有人說“將兩個執行緒合併”。這樣解釋我覺得理解起來還更麻煩。不如就借鑑下API裡的說法:

“等待該執行緒終止。”

解釋一下,是主執行緒(我在“一”裡已經命名過了)等待子執行緒的終止。也就是在子執行緒呼叫了join()方法後面的程式碼,只有等到子執行緒結束了才能執行。(Waits for this thread to die.)


有感於計算機教育某方面的缺失,為什麼學生們學得不明不白,關鍵是教育的問題啊!!!計算機裡很多詞彙都是有來頭的,如果老師懂這些淵源並在課堂上講出來,必定會讓學生印象深刻,然而很多老師只知道join是阻塞執行緒,可是學生怎麼也想不明白“參加”這個英文單詞怎麼到了計算機裡就變成了“阻塞”的意思了呢,可能連老師們自己都是死記硬背的吧。