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才退出。java

咱們知道在c++的win32編程(CreatThread()),main函數執行完了,寄宿線程也跟着退出了,在c#中若是你用線程池(ThreadPool)的話,結論也是如此,線程都跟着宿主進程的結束而結束。可是在java中貌似和咱們的認知有很大的出入,這是爲何呢?c++

這是因爲java的虛擬機種有兩種線程,一種叫叫守護線程,一種叫非守護線程,main函數就是個非守護線程,虛擬機的gc就是一個守護線程。java的虛擬機中,只要有任何非守護線程尚未結束,java虛擬機的實例都不會退出,因此即便main函數這個非守護線程退出,可是因爲在main函數中啓動的匿名線程也是非守護線程,它尚未結束,因此jvm沒辦法退出。編程

java虛擬機的生命週期,當一個java應用main函數啓動時虛擬機也同時被啓動,而只有當在虛擬機實例中的全部非守護進程都結束時,java虛擬機實例才結束生命。c#

相關文章
相關標籤/搜索