Java中的父線程與子線程


參考資料:https://my.oschina.net/hosee/blog/509557

結論:父線程的生命周期與子線程沒有關系。

個人感覺:每個線程包括main線程(除了守護線程)都是平級關系,不像父子進程一樣(父進程先消亡子變成孤兒進程),只有除了守護線程外所有線程都結束了,才會結束JVM

如果main方法中沒有創建其他線程,那么當main方法返回時==>JVM就會結束==>Java應用程序。

但如果main方法中創建了其他線程,那么JVM就要在主線程和其他線程之間輪流切換,保證每個線程都有機會使用CPU資源,main方法返回(主線程結束)JVM也不會結束,要一直等到該程序所有線程全部結束才結束Java程序(另外一種情況是:程序中調用了Runtime類的exit方法,並且安全管理器允許退出操作發生。這時JVM也會結束該程序)。

那么又有個思考,JVM是怎么知道線程都結束的呢?

JVM中有一個線程DestroyJavaVM,執行main()的線程在main執行完后調用JNI中的jni_DestroyJavaVM()方法喚起DestroyJavaVM線程。JVM在Jboss服務器啟動之后,就會喚起DestroyJavaVM線程,處於等待狀態,等待其它線程(java線程和native線程)退出時通知它卸載JVM。線程退出時,都會判斷自己當前是否是整個JVM中最后一個非deamon線程,如果是,則通知DestroyJavaVM線程卸載JVM。ps:擴展一下:1.如果線程退出時判斷自己不為最后一個非deamon線程,那么調用thread->exit(false),並在其中拋出thread_end事件,jvm不退出。2.如果線程退出時判斷自己為最后一個非deamon線程,那么調用before_exit()方法,拋出兩個事件: 事件1:thread_end線程結束事件、事件2:VM的death事件。然后調用thread->exit(true)方法,接下來把線程從active list卸下,刪除線程等等一系列工作執行完成后,則通知正在等待的DestroyJavaVM線程執行卸載JVM操作。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com