首页 文章

如果守护程序线程正在运行,如何使程序保持活动状态?

提问于
浏览
3

我有一个要求,我想启动一个轮询器,它将一直运行,直到机器重新启动或进程被杀死 . 现在,我尝试使用shell脚本从主方法启动轮询器,但问题是,只要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方法的执行完成,我的poller就会停止工作,因为JVM关闭了 .

有了这个问题,我该怎么办 .

谢谢

3 回答

  • 5

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

    编辑:

    上面回答了问题"how to create a daemon thread",但是(因为问题的范围已经改变),一个正确的答案是:如果你希望你的线程在主线程完成后让JVM不退出,就不要创建一个守护程序线程 .

  • 4

    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)如果你需要一个干净的方法来关闭deamonthread . 考虑实施InterruptedException以退出轮询任务 . 您也可以使用shutdown hook .

  • 2

    Java中的术语"daemon thread"有点误导,因为它实际上意味着“该线程是 not 应该保持JVM活着” . 这意味着一旦最后一个非守护程序线程终止,JVM就会关闭(正如您在问题中已经说明的那样) .

    您可能正在寻找的是Apache Commons Daemon项目,该项目允许创建好的"system services",通过 /etc/init.d/ 条目和所有项目启动 . 这适用于Windows和* nix系统 .

相关问题