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來講,他們並無什麼特別的依賴聯繫,兩個獨立的線程。
相關文章
相關標籤/搜索