2011-12-30 242 views
2

大家好,守护进程线程会在封闭线程结束时停止工作吗?或者当“主”线程完成时守护线程会停止?java守护进程线程

我在jre6上测试了这个例子,结果是daemon thread stopped working when the enclosing it thread finished。请注意,java文档表示守护进程线程在没有其他应用程序线程保留时被终止。并不是说守护线程在父非守护线程保持不变时被杀死。

请给我答案。请寄给我关于这个问题的任何材料。 对不起,我的英文。

public class Main { 
    public static void main(String[] args) { 
     Thread simple = new Thread(new SimpleTask()); 
     simple.start(); 
    } 
} 

class SimpleTask implements Runnable { 
    public void run() { 
     try { 
      Thread daemon = new Thread(new DaemonTask()); 
      daemon.setDaemon(true); 
      daemon.start(); 
      Thread.sleep(5000); 
     } catch (InterruptedException e) {} 
    }; 
} 

class DaemonTask implements Runnable { 
    public void run() { 
     int i = 0; 
     while (true) { 
      try { 
       System.out.println("a" + (i++)); 
       Thread.sleep(500); 
      } catch (InterruptedException e) {} 
     } 
    } 
} 

回答

11

将守护线程停止时,封闭它的线程将完成的工作?

在Java中没有“封闭线程”这样的概念。有线程但它们很少使用。

守护进程线程只是线程,不会阻止JVM终止。当没有任何非守护线程离开时,JVM将终止。如果仍有一些非守护进程线程正在执行,那么JVM将继续运行,包括任何守护进程线程 - 无论这些守护进程线程是否已完成启动的线程。

+1

现货!关键是“当没有任何非守护进程线程时,JVM将终止” – Manish 2011-12-30 09:24:28

+0

Jon Skeet说的是正确的。在您的示例中,当您的SimpleTask终止时,守护线程将停止。原因是您的主线程在SimpleTask终止之前停止。所以,当SimpleTask被终止,这是最后一个非恶魔线程,因此你的守护线程也停止 – 2011-12-30 09:26:57

1

由于主线程一旦启动简单线程就结束,简单线程就是最后一个应用线程完成,所以守护线程在线程结束时结束。

简单的线程是启动守护进程线程的事实与此无关。

1

守护进程线程停止工作,因为没有任何非守护进程线程离开,而不是因为父线程完成。

3

大家好,请问守护线程停止工作时,它的线程 将完成?或者当主“主线程” 完成时守护线程将停止?

当主执行线程和所有用户线程终止它们的执行时,守护线程将被JVM停止。 然后,守护进程线程严格依赖于用户线程和程序主线程的执行。

相反,JVM会关闭你的程序,直到所有的用户线程都被终止。

作为回顾,用户线程是保持一个程序从退出一个线程,因为,即使你的程序的主线程终止时,JVM不会直到所有的用户线程完成中断程序要求的工作。只有所有用户线程都终止时,JVM才能关闭程序。

然后,守护进程线程是一个线程,不会阻止程序退出。 有关其他信息,请检查this SO的旧问题。

检查Thread APIsetDaemon()方法报告的文档如下:

将此线程标记为守护进程线程或用户线程。当运行的唯一线程全部为守护进程 线程时,Java虚拟机退出。

还是Runtime API

1)程序正常退出,最后的非守护线程退出时:

Java虚拟机响应2种 事件关闭或 当退出(等同于System.exit)方法被调用时,或者

2)虚拟机终止以响应用户中断, 如打字^​​ C或全系统事件(例如用户注销或系统关闭)。

+0

@Downvoter你能解释一下downvote的原因吗? – 2015-11-27 08:50:54