Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建执行TimerTasks的守护进程?_Java_Daemon - Fatal编程技术网

Java 如何创建执行TimerTasks的守护进程?

Java 如何创建执行TimerTasks的守护进程?,java,daemon,Java,Daemon,我需要在Java中创建一个守护进程,通过HTTP定期检索数据并将其存储在数据库中 当主线程启动时,它从配置文件中读取数据源和轮询间隔,并为每个数据源创建具有适当间隔的TimerTask。此外,它调用Runtime.getRuntime().addShutdownHook()来添加一个关机钩子,该钩子在关机之前执行任何需要的清理。在那之后,主线程就没有别的事情可做了 该守护进程旨在用于典型的Unix环境,即通过启动/停止脚本控制,但它应该可以移植到其他操作系统(例如,带有SrvAny的Window

我需要在Java中创建一个守护进程,通过HTTP定期检索数据并将其存储在数据库中

当主线程启动时,它从配置文件中读取数据源和轮询间隔,并为每个数据源创建具有适当间隔的
TimerTask
。此外,它调用
Runtime.getRuntime().addShutdownHook()
来添加一个关机钩子,该钩子在关机之前执行任何需要的清理。在那之后,主线程就没有别的事情可做了

该守护进程旨在用于典型的Unix环境,即通过启动/停止脚本控制,但它应该可以移植到其他操作系统(例如,带有SrvAny的Windows)


我该怎么办?如果我只是让主线程退出,
TimerTask
实例是否会保持VM运行,直到所有实例都被取消?如果没有,我将如何实现这一点?

这取决于调度
TimerTask
计时器:如果创建该
计时器是为了不将其任务作为守护进程运行,则即使在主线程完成其工作后,挂起的
TimerTask
仍将使VM保持活动状态。这是所有
计时器
构造函数的情况,这些构造函数不采用
布尔
参数,或者
布尔
参数为

以下内容似乎按预期工作:

package com.example.daemon;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class SampleDaemon {
    private static Timer testTimer = new Timer(false);

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                System.out.println("Received shutdown request!");
                if (testTimer != null)
                    testTimer.cancel();
                testTimer = null;
            }
        });
        testTimer.schedule(new TestTimerTask(), new Date(), 2000);
    }

    private static class TestTimerTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("Still running…");
        }
    }
}
它每2秒打印一次仍在运行的
。当JVM收到
SIGTERM
时,程序将打印
收到的关机请求并退出。这也可以通过从控制台发送Ctrl+C来实现<代码>SIGHUP
的作用与SIGTERM
相同


SIGCONT
无效
SIGUSR1
导致硬退出(可能与
SIGKILL
相同),即不执行关机挂钩。

Java中的线程有一个标志,指示它们是否应该保持jvm活动。此标志称为“守护进程”:当只有守护进程线程运行时,jvm将退出

默认情况下,计时器启动的线程不是守护进程线程,因此它将使jvm保持活动状态,这正是您想要的。如果希望jvm退出,可以使用
newtimer(true)
创建计时器-这将设置守护进程标志