【问题标题】:How to keep my program alive for as long a daemon thread is running?只要守护程序线程正在运行,如何使我的程序保持活动状态?
【发布时间】:2011-06-27 10:56:50
【问题描述】:

我有一个要求,我想启动一个轮询器,它将永远运行,直到机器重新启动或进程被杀死。现在,我尝试使用 shell 脚本从 main 方法启动轮询器,但问题是,一旦 main 方法完成执行,轮询器也停止工作,因为我没有使用任何服务器来实现。

我听说过daemon threads,但我想知道如何创建一个守护线程,它将永远运行,并帮助我的轮询器也运行。

更新:

public class SomeThread extends Thread {

    @Override
    public void run() {
        UnitPoller unitPoller = new UnitPoller();
        unitPoller.doPolling();
    }

    public static void main(String[] args) {
        SomeThread someThread = new SomeThread();
        someThread.setDaemon(true);
        someThread.start();
    }
}

上面是我更新的类,现在每当我从 main 方法执行这个线程时,它都会创建一个线程,但是一旦 main 方法的执行完成,我的轮询器就会停止工作,因为 JVM 关闭了。

遇到这个问题,我该怎么办。

谢谢

【问题讨论】:

    标签: java daemon


    【解决方案1】:

    您只需创建一个线程并在调用th.start() 之前调用th.setDaemon(true)

    编辑:

    上面回答了“如何创建守护线程”的问题,但是(由于问题的范围已经改变),正确的答案是:不要创建守护线程如果您希望您的线程在主线程完成后阻止 JVM 退出。

    【讨论】:

    • @M.J.:Thread.setDaemon() 的 JavaDoc 说:“当唯一运行的线程都是守护线程时,Java 虚拟机退出”。所以如果你的线程是一个守护进程,JVM就会退出。如果你想让 JVM 保持运行,你需要一个非守护线程。
    • 在问题得到澄清后,删除答案中被证明不正确的部分怎么样?
    【解决方案2】:

    1) 你需要someThread.setDaemon(false) 而不是'true'。守护线程实际上不会阻止 java 关闭。

    来自 javadoc:

    void java.lang.Thread.setDaemon(boolean on)

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

    这个方法必须在线程启动之前调用。

    2)我认为这不是您的主要方法,而是您的 run() 方法很快就会完成。尝试在 doPolling 方法周围放置一个 while (true) 循环。

    @Override
    public void run() {
        UnitPoller unitPoller = new UnitPoller();
        while (true)
           unitPoller.doPolling();
    }
    

    3) 在 main 中调用 join() 然后依赖守护线程行为更简洁。

        try {
            someThread.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    

    4) 如果您需要一种干净的方式来关闭守护线程。考虑实现InterruptedException 以退出轮询任务。您也可以使用shutdown hook

    【讨论】:

      【解决方案3】:

      Java 中的“守护线程”一词有点误导,因为它的真正意思是“该线程应该让 JVM 保持活动状态”。这意味着 JVM 将在最后一个非守护线程终止后立即关闭(正如您在问题中所述)。

      您可能正在寻找的是Apache Commons Daemon 项目,它允许创建漂亮的“系统服务”,从/etc/init.d/ 条目开始。这适用于 Windows 和 *nix 系统。

      【讨论】:

        猜你喜欢
        • 2014-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        相关资源
        最近更新 更多