在给定时间引发预定的活动?

时间:2013-05-09 14:11:15

标签: java scheduled-tasks

我正在编写一个基于Java的shell类型... erm .. thing 。无论如何,我正在实现的命令之一是schedule命令,您可以在其中告诉它您要运行命令的时间,它等待时间,运行命令一次,然后退出。但是,我无法弄清楚如何让它来检查时间 - 我实施的只是检查日期是否相等,做了一点研究以确定是否存在更好的解决方案,然后发现显然Date使用起来不是一件好事。我该怎么办?

MCVE:

import java.util.Date;

public class Scheduler extends Thread {
    private Date goAt;
    private String command;
    public Scheduler(Date goAt, String command) {
        this.goAt = goAt;
        this.command = command;
    }
    public void start() {
        super.start();
    }
    public void run() {
        while (!goAt.equals(new Date())) {} //Wait until the dates are equal
        runCommand(command); //In the real thing, this runs the command.
    }
    public void runCommand(String command) {
        System.out.println("Command: " + command);
    }
    public static void main(String[] args) {
        Scheduler task = new Scheduler(new Date(System.currentTimeMillis() + 5000));
        task.start();
    }
}

我希望在不使用第三方库或必须单独下载的库的情况下完成此操作。如果没有办法这样做,那么我将接受第三方库的答案,但优先选择没有它们的解决方案。同样理想的情况是,如果答案允许我直接指定运行命令的时间,而不是计算相对时间差并使用它。

2 个答案:

答案 0 :(得分:1)

使用the builtin java.util.Timer class安排代码在给定的未来时间或在给定的延迟之后运行。

答案 1 :(得分:0)

一种选择是使用Timers / TimerTasks来安排命令 - here is a tutorial

另一种选择是将命令放在DelayQueue中(延迟设置为任务应该触发的时间),然后使用消费者线程重复调用队列上的take并触发它删除的命令。

就第三方库而言,Quartz是一个很好的调度程序。