java守护程序线程

时间:2011-12-30 09:19:48

标签: java multithreading daemon

大家好,当封闭它的线程完成时,守护程序线程是否会停止工作?或者“主”线程完成时守护程序线程会停止吗?

我在jre6上测试了这个例子,结果是daemon thread stopped working when the enclosing it thread finished。请注意,java docs表示当没有其他应用程序线程时,守护程序线程将被终止。并且不会说当父级非守护程序线程仍然存在时,守护程序线程被杀死。

请给我答案。请寄给我关于这个问题的任何材料。 抱歉我的英文。

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) {}
        }
    }
}

4 个答案:

答案 0 :(得分:11)

  

守护程序线程在封闭它的线程完成后会停止工作吗?

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

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

答案 1 :(得分:3)

  

大家好,当封闭它的线程时,守护程序线程会停止工作   即将完成?或者守护线程将在“主”线程停止时停止   完成?

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

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

作为回顾,用户线程是一个阻止程序退出的线程,因为即使程序的主线程被终止,JVM也不会停止你的程序,直到所有的用户线程已完成请求的作业。只有当所有用户线程都已终止时,JVM才能关闭该程序。

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

检查Thread API。以下setDaemon()方法报告的文档:

  

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

Runtime API

  

Java虚拟机关闭以响应两种   事件:

     

1)当最后一个非守护程序线程退出或时,程序正常退出   当调用exit(等效,System.exit)方法时,或

     

2)虚拟机终止以响应用户中断,   例如键入^ C或系统范围的事件,例如用户注销或   系统关闭。

答案 2 :(得分:1)

由于主线程在启动简单线程后立即结束,因此简单线程是最后完成的应用程序线程,因此守护线程在此线程结束时结束。

简单线程是启动守护程序线程的线程与此无关。

答案 3 :(得分:1)

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