有的時候對於Java多線程,我們會聽到“父線程、子線程”的概念。
嚴格的說,Java中不存在實質上的父子關系
沒有方法可以獲取一個線程的父線程,也沒有方法可以獲取一個線程所有的子線程
子線程的消亡與父線程的消亡並沒有任何關系,不會因為父線程的結束而導致子線程退出(操作系統中如此)。
父線程說法來源
父線程的說法應該是來自於Thread的構造對象時的初始化方法
再次看一下init方法,以下內容截取關鍵部分
可以看得出來,在init方法中,將創建這個線程的當前線程定義為“父”
Thread parent = currentThread();
在初始化之后,線程組(如果沒設置)、是否為守護線程、優先級、上下文類加載器、父線程ThreadLocal(稍后講解)都是從當前線程獲取的
除了一些初始值的設置來自於所謂“父線程”之外,並沒有強關系
所以說,對Java中的線程,父線程的概念,只是一種邏輯稱呼,創建線程的當前線程就是新線程的父線程,新線程的一些資源來自於這個父線程
在init方法中,對於所謂父線程的處理邏輯,換一個說法就是借助於當前正在運行的線程,對新創建線程進行一些必要的賦值與初始化
測試
下面的示例中,在主線程中創建了一個線程
線程中,循環三次打印當前線程名稱,每次打印sleep 1秒
從結果可以看得出來,主線程結束后,子線程並沒有結束,仍舊是繼續運行,等到運行結束后,JVM退出
ps:上圖黃色區域是編譯器的提示,沒什么事兒
結論
在Java中的確存在父線程、子線程的說法,代碼中對這種說法也存在一定的邏輯體現
但是這種邏輯體現更多的是一種稱謂,是一種人類認知層面上的,在程序這種“較真”的世界里面,所謂父線程只是創建新線程的當前線程
父線程的准確稱呼應該被叫做當前線程的創建線程
當聽到父線程的說法時,應該立即聯想到的是創建線程,創建新線程時一些資源的供給者
一個線程與被他創建出來的線程,除了在創建的時候(init)會有一定的依賴交互之外,對JVM來說,他們並沒有什么特別的依賴聯系,兩個獨立的線程。