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操作。

 

posted @ 2018-02-27 14:13  乱马1/2  阅读(3369)  评论(0编辑  收藏  举报