2016-03-19 2 views
0

Как я могу выполнить определенный набор инструкций внутри TimerTask непрерывно без задержки в течение заданного времени? Ниже приведены коды, которые я пытаюсь реализовать выше.Выполнять задачу непрерывно без задержки внутри Java TimerTask

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
    public void run() { 
     System.out.println("Test started at: " + new Date()); 

     // Do something continuously without delay 

     System.out.println("Test finished at: " + new Date());       
    } 
}, 0); 
+1

Вы хотите, чтобы задача запуска и остановки в определенное время или задержки в будущем? Если да, см. Мой ответ ниже, иначе проясните вопрос. – Raman

+0

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

ответ

1

Второй параметр метода schedule время, чтобы приступить к выполнению задачи таймера (или задержки по отношению к сейчас), а не продолжительность времени, таймер будет выполняться в течение.

Это не совсем ясно из вашего вопроса, но я предполагаю, что вы хотите, чтобы задача начиналась и останавливалась в определенное время (или задержки относительно этого) в будущем. Если это так, то я бы приблизился к этому, чтобы создать Thread, который выполняет нужную вам задачу. Так как TimerTask является Runnable, который выполняется как Thread после запуска Timer, вы можете просто использовать экземпляр этого TimerTask. Убедитесь, что Runnable содержит настраиваемое поле, например running. В этом потоке, запустить задачу в цикле в то время как это:

public void run() { 
    while(running) { /* do my task */ } 
} 

Затем используйте один Timer запланировать Runnable, чтобы начать в то время вам нужно. Используйте другой таймер, чтобы установить параметр running той же темы в значение false в момент, когда вы хотите его остановить. Параметр running должен быть изменчивым, чтобы гарантировать, что его изменения со второго таймера потока будут видны первым таймером. Так это будет выглядеть примерно так (не проверена):

class StoppableTimerTask extends TimerTask { 
    private volatile boolean running = true; 
    public void stopRunning() { this.running = false; } 
    public void run() { 
     while(running) { /* do my task */ } 
    } 
} 

final StoppableTimerTask task = new StoppableTimerTask(); 
timer.schedule(task, startTime); 
timer.schedule(new TimerTask() { 
    public void run() { 
     task.stopRunning(); 
    } 
}, stopTime); 

В зависимости от того, что ваше «что-то», вы можете захотеть взглянуть на прерывания темы. Например, если он блокирует IO, ваш код не будет зацикливаться и проверять значение running до завершения блокировки IO. Прерывание потока (может) привести к тому, что это произойдет. См. http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt--. Это может работать или может не работать, и может быть сложно получить право, поэтому, если вам понадобится этот поток для выхода как можно ближе к желаемому времени, предпочитайте запуск блокировки ввода-вывода и подобных операций с меньшими таймаутами, чтобы поток мог проверьте, следует ли продолжать работать чаще.

ОБНОВЛЕНИЕ: Согласно комментарию, указывающему, что задача должна начинаться сразу, она становится еще проще. Первоначальной задачей не требуется даже расширение TimerTask - это может быть обычный Thread, который запускается немедленно. Таймер нужен только для остановки в указанное время.

+0

Это очень близко к тому, что я ищу. Благодарю. – thotheolh

+0

@thotheolh Рад помочь, обратите внимание на мое обновление, основанное на вашем ответе на мой комментарий. – Raman