【问题标题】:java daemon threadsjava守护线程
【发布时间】:2011-12-30 09:19:47
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading daemon


    【解决方案1】:

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

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

    守护线程只是不会阻止 JVM 终止的线程。当没有任何非守护线程剩余时,JVM 将终止。如果仍有一些非守护线程在执行,JVM 将继续运行,包括任何守护线程 - 无论启动这些守护线程的线程是否已经结束。

    【讨论】:

    • 看准了!关键是“当没有任何非守护线程时,JVM将终止”
    • Jon Skeet 所说的是正确的。在您的示例中,当您的 SimpleTask 终止时,守护程序线程将停止。原因是您的主线程在 SimpleTask 终止之前已停止。因此,当 SimpleTask 终止时,这是最后一个非恶魔线程,因此您的守护线程也会停止
    【解决方案2】:

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

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

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

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

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

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

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

    或者Runtime API

    Java 虚拟机响应两种情况而关闭 事件:

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

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

    【讨论】:

    • @Downvoter 你能解释一下你投反对票的原因吗?
    【解决方案3】:

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

    简单线程是启动守护线程的那个这一事实与此无关。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多