參考資料:https://my.oschina.net/hosee/blog/509557java
結論:父線程的生命週期與子線程沒有關係。 安全
我的感受:每一個線程包括main線程(除了守護線程)都是平級關係,不像父子進程同樣(父進程先消亡子變成孤兒進程),只有除了守護線程外全部線程都結束了,纔會結束JVM服務器
若是main方法中沒有建立其餘線程,那麼當main方法返回時==>JVM就會結束==>Java應用程序。jvm
但若是main方法中建立了其餘線程,那麼JVM就要在主線程和其餘線程之間輪流切換,保證每一個線程都有機會使用CPU資源,main方法返回(主線程結束)JVM也不會結束,要一直等到該程序全部線程所有結束才結束Java程序(另一種狀況是:程序中調用了Runtime類的exit方法,而且安全管理器容許退出操做發生。這時JVM也會結束該程序)。 spa
那麼又有個思考,JVM是怎麼知道線程都結束的呢?.net
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操做。 線程