2014-12-28 41 views
0

我研究了“what is deamon thread in java为什么JVM需要退出?

它提到“守护线程是一个线程,这并不妨碍JVM从离开当节目结束,但线程仍在运行”。

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

+3

JVm就像任何其他进程一样,它需要退出 –

+0

你知道一个进程是什么吗? –

+2

当程序完成后,您希望JVM退出。 – YMomb

回答

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线程,所以当主线程(不是deamon线程)完成时JVM停止。

0

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

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不会退出)。让它结束的唯一方法是让睡眠完成或手动终止运行应用程序的进程。

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

希望清除它。

1

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

守护线程不应该保存任何资源。如果你违反了这个基本规则,那么你的线程不符合守护线程的条件。

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

1

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

即使有是始终运行单个JVM,您的应用程序的线程仍然需要终止一旦你的应用程序的工作完成了,否则线程仍然会浪费内存和资源。

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