为什么JVM需要退出?

时间:2014-12-28 08:14:06

标签: java

我正在研究" what is deamon thread in java"

它提到了#34;守护程序线程是一个线程,当程序完成但线程仍在运行时,它不会阻止 JVM退出

我的后续问题是为什么JVM需要退出或不退出?到底是怎么回事?我认为JVM一直在运行。这是真的吗?我为什么要关心JVM是否在做什么?

5 个答案:

答案 0 :(得分:2)

public class Example{
    public static void main(String[] args){
        System.out.println("Hi!");

        // What's happening here?
    }
}

看看评论说明这​​里发生了什么?那里发生了什么? JVM是关于程序即将完成的退出。 java虚拟机只能在程序运行时运行,它在程序启动时启动,在程序结束时结束。

现在,如果我们考虑:

public class Example{
    public static void main(String[] args){
        System.out.println("Hi!");

        Thread t = new Thread(new Runnable(){
            public void run(){
                try{
                    Thread.sleep(Long.MAX_VALUE);
                }catch(InterruptedException ex){}
            }
        });

        t.start();

        // What's happening here?
    }
}

评论存在时会发生什么。答案是什么。当另一个线程仍处于活动状态且非守护进程时,程序继续运行(因此JVM不会退出)。使它结束的唯一方法是让睡眠完成或手动终止运行应用程序的过程。

用最简单的术语(如果你是迂腐的话,并不完全正确),JVM对Java应用程序的运行寿命可以等同于应用程序本身的运行寿命。在大多数情况下,您可以将术语JVM替换为“我的应用程序”而没有太多问题。

希望能够解决它。

答案 1 :(得分:1)

Deamon线程就像一个支持执行的实用程序线程。例如,memory management是一个Deamon线程,支持您的进程内存管理。您的过程完成后,如果它不是Deamon线程,它将永远运行。所以你的过程永远不会完成。但是在完成该过程后JVM应该停止。因此,当您的系统仅运行deamon线程时,JVM会停止。

public class ThreadExample {
    public static void main(String args[]){
        new DeamonThread().start();
        for(int i=0;i<5;i++){
            System.out.println("Main thread is running "+ i+" time");
        }

    }
}

class DeamonThread extends Thread{
    DeamonThread(){
        setDaemon(true);
    }
    public void run(){
        int count=0 ;
        while (true) {
            System.out.println("Hello from Deamon Thread "+count++) ;
            try {
                sleep(1000);
            } catch (InterruptedException e) {}
        }
    }
}

在此示例中,主线程仅包含5次迭代。但是Deamon线程有无限的迭代。如果它不是deamon线程,它将永远运行。但它是一个Deamon线程,所以JVM在主线程(不是deamon线程)完成时停止。

答案 2 :(得分:1)

Daemon threads are helping threads,垃圾收集例如是一个守护程序线程。

守护程序线程不应该持有任何资源。如果您违反了这个基本规则,那么您的线程就没有资格成为守护程序线程。

完成所有线程的运行并且只剩下守护程序线程后,JVM应该停止,因为线程池中没有其他线程挂起。

答案 3 :(得分:1)

不,JVM并不总是在运行。通常它根本不运行。当您启动基于Java的程序时,它会启动JVM进程的实例。如果您启动了几个基于Java的程序或一个程序的多个实例,那么您将获得多个JVM。它们不会被重复使用,因此旧的无用,需要在应用程序完成时消失,以防止进食。查看您的系统任务管理器,您将看到JVM何时运行,以及有多少正在运行。

即使只有一个JVM始终在运行,一旦应用程序的工作完成,您的应用程序的线程仍然需要终止,否则线程仍会浪费记忆和资源。

因此无论JVM是否始终运行,能够将线程设置为守护程序线程仍然有用,因为您不必记住手动停止它们。一旦非守护程序线程完成,守护程序线程就会自行停止。

答案 4 :(得分:0)

您可能会将守护程序线程与守护程序进程混淆。您可以在需要时轻松地将JVM作为守护进程运行(即您正在运行服务器)。这与在大多数操作系统中作为守护程序运行任何其他进程非常相似。但是,Java守护程序线程有所不同,您通常不会使用它们来运行特定于服务器的任务。例如,您可以将它们用于清理任务。