• JVM的生命周期


    package test;  
      
    public class JVMTestLife {  
        public static void main(String[] args) {  
            new Thread(new Runnable() {  
                @Override  
                public void run() {  
                    for(int i=0;i<5;i++){  
                        try {  
                            Thread.currentThread().sleep(i*10000);  
                            System.out.println("睡了"+i*10+"秒");  
                        } catch (InterruptedException e) {  
                            System.out.println("干嘛吵醒我");  
                        }  
                    }  
                }  
            }).start();   
              
            for(int i=0;i<50;i++){  
                    System.out.print(i);  
            }  
        }  
    }  

    观察控制台输出和任务管理器的javaw.exe会发现,当main函数的for循环打印完的时候,程序居然没有退出,而等到整个new Thread()里的匿名类的run方法执行结束后,javaw.exe才退出。

    我们知道在c++的win32编程(CreatThread()),main函数执行完了,寄宿线程也跟着退出了,在c#中如果你用线程池(ThreadPool)的话,结论也是如此,线程都跟着宿主进程的结束而结束。但是在java中貌似和我们的认知有很大的出入,这是为什么呢?

    这是由于java的虚拟机种有两种线程,一种叫叫守护线程,一种叫非守护线程,main函数就是个非守护线程,虚拟机的gc就是一个守护线程。java的虚拟机中,只要有任何非守护线程还没有结束,java虚拟机的实例都不会退出,所以即使main函数这个非守护线程退出,但是由于在main函数中启动的匿名线程也是非守护线程,它还没有结束,所以jvm没办法退出。

    java虚拟机的生命周期,当一个java应用main函数启动时虚拟机也同时被启动,而只有当在虚拟机实例中的所有非守护进程都结束时,java虚拟机实例才结束生命。

  • 相关阅读:
    Java实现 洛谷 P1028 数的计算
    Java实现 洛谷 P1028 数的计算
    Java实现 洛谷 P1028 数的计算
    Nginx+Memcached+Tomcat集群配置(MSM--win7 64bit)
    Tomcat安装、配置、优化及负载均衡详解
    Nginx+Tomcat+Memcached部署
    Nginx+Tomcat+Memcached实现会话保持(MSM)
    Nginx+tomcat配置集群负载均衡
    Nginx+Tomcat搭建高性能负载均衡集群的实现方法
    Nginx+Tomcat的配合使用
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/5752853.html
Copyright © 2020-2023  润新知