Второй параметр метода 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
, который запускается немедленно. Таймер нужен только для остановки в указанное время.
Вы хотите, чтобы задача запуска и остановки в определенное время или задержки в будущем? Если да, см. Мой ответ ниже, иначе проясните вопрос. – Raman
Я хотел бы, чтобы программа запускалась сразу после вызова, а затем в течение 60 секунд непрерывно запускала определенную функцию без остановки или сна между ними и после 60 секунд непрерывной работы, я хочу, чтобы она решительно остановила задачу. – thotheolh