2014-12-28 7 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 должен остановиться после того, как вы завершили процесс. Поэтому 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, поэтому 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? 
    } 
} 

Что произойдет в точке, где комментарий существует. Ответ - ничто. Поскольку другой поток все еще жив и не-daemon, программа продолжает работать (и, следовательно, JVM не выходит). Единственный путь, чтобы завершить его, - это либо завершение сна, либо ручное завершение процесса, запускающего приложение.

В наиболее упрощенных терминах (и не совсем точно, если вы педантичны) срок службы JVM для приложения Java может быть приравнен к сроку службы самого приложения. В большинстве ситуаций вы можете заменить термин JVM на «мое приложение» без особых проблем.

Надеюсь, что очистит его.

1

Daemon threads are helping threads, сбор мусора, например, нить демона.

Нищий демона не должен содержать никаких ресурсов. Если вы нарушаете это основное правило, ваш поток не может претендовать на роль потока демона.

После того, как вы закончили выполнение всех потоков, и только потоки демона останутся JVM, следует остановить, поскольку в пуле потоков не осталось других потоков.

1

Нет, JVM не всегда работает. Обычно он не работает вообще.Когда вы запускаете Java-программу, которая запускает экземпляр JVM-процесса. Если вы запускаете несколько программ на базе Java или несколько экземпляров одной программы, вы получаете несколько JVM. Они не используются повторно, поэтому старые из них бесполезны и должны уходить, когда ваше приложение завершено, чтобы предотвратить едение памяти. Посмотрите на свой системный диспетчер задач, и вы увидите, когда работает JVM и сколько работает.

Даже если были одной виртуальной машины Java, который всегда работает, потоки вашего приложения еще нужно прекратить, как только работа вашего приложения будет сделано, иначе нити все равно будет тратить память и ресурсы.

Так что независимо от того, всегда ли работает JVM или нет, возможность устанавливать потоки как потоки демона по-прежнему полезна, так как вам не нужно забывать вручную их останавливать. Демона-потоки останавливаются, как только потоки не-демона выполняются.

Смежные вопросы