Java多線程父子線程關系 多線程中篇(六)


有的時候對於Java多線程,我們會聽到“父線程、子線程”的概念。
嚴格的說,Java中不存在實質上的父子關系
沒有方法可以獲取一個線程的父線程,也沒有方法可以獲取一個線程所有的子線程
子線程的消亡與父線程的消亡並沒有任何關系,不會因為父線程的結束而導致子線程退出(操作系統中如此)。

父線程說法來源

父線程的說法應該是來自於Thread的構造對象時的初始化方法
再次看一下init方法,以下內容截取關鍵部分
image_5c63e84a_594a
可以看得出來,在init方法中,將創建這個線程的當前線程定義為“父”
        Thread parent = currentThread();
在初始化之后,線程組(如果沒設置)、是否為守護線程、優先級、上下文類加載器、父線程ThreadLocal(稍后講解)都是從當前線程獲取的
除了一些初始值的設置來自於所謂“父線程”之外,並沒有強關系
所以說,對Java中的線程,父線程的概念,只是一種邏輯稱呼,創建線程的當前線程就是新線程的父線程,新線程的一些資源來自於這個父線程
在init方法中,對於所謂父線程的處理邏輯,換一個說法就是借助於當前正在運行的線程,對新創建線程進行一些必要的賦值與初始化

測試

下面的示例中,在主線程中創建了一個線程
線程中,循環三次打印當前線程名稱,每次打印sleep 1秒
從結果可以看得出來,主線程結束后,子線程並沒有結束,仍舊是繼續運行,等到運行結束后,JVM退出
image_5c63e84b_53a4
ps:上圖黃色區域是編譯器的提示,沒什么事兒
image_5c63e84b_4ad2

結論

在Java中的確存在父線程、子線程的說法,代碼中對這種說法也存在一定的邏輯體現
但是這種邏輯體現更多的是一種稱謂,是一種人類認知層面上的,在程序這種“較真”的世界里面,所謂父線程只是創建新線程的當前線程
父線程的准確稱呼應該被叫做當前線程的創建線程
當聽到父線程的說法時,應該立即聯想到的是創建線程,創建新線程時一些資源的供給者
一個線程與被他創建出來的線程,除了在創建的時候(init)會有一定的依賴交互之外,對JVM來說,他們並沒有什么特別的依賴聯系,兩個獨立的線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM