2013-05-09 2 views
2

Я пишу Java-shell shell-type ... erm .. вещь. Во всяком случае, одна из команд, которые я реализую, - это команда 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(); 
    } 
} 

Я хотел бы, чтобы это было сделано без использования сторонних библиотек или библиотек, которые должны быть загружены отдельно. Если нет способа сделать это, я буду принимать ответы с сторонней библиотекой, но предпочтение отдается решениям без них. Также идеально было бы, если бы ответы позволили мне прямо указать время для запуска команды, а не вычислять относительную разницу во времени и использовать ее.

ответ

0

Один из вариантов заключается в использовании Timers/TimerTasks для планирования команд - here is a tutorial.

Другой вариант - поместить команды в DelayQueue (с задержкой, установленной на время, когда должна быть выполнена задача), а затем использовать потребительский поток для повторного вызова take в очереди и запускать команды, которые он удаляет.

С точки зрения сторонних библиотек, Quartz - хороший планировщик.

+0

Таймеры могут выполнить свою работу, но у них есть проблемы, над которыми нужно следить. Вместо этого рекомендуется использовать http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html. См. Http://stackoverflow.com/questions/409932/java-timer-vs-executorservice для объяснения. – Tansir1

+0

Мертвая ссылка для основной части ответа. В ответе укажите пример кода. –

1

Используйте the builtin java.util.Timer class, чтобы запланировать выполнение кода в определенное время или после заданной задержки.

Смежные вопросы