Ответ 1
В то время как java.util.Timer
был хорошим способом запланировать будущие задачи, теперь предпочтительнее 1 вместо этого использовать классы в пакете java.util.concurrent
.
Существует ScheduledExecutorService
, который разработан специально для запуска команды после задержки (или для их выполнения периодически, но это не относится к на этот вопрос).
Он имеет schedule(Runnable, long, TimeUnit)
метод, который
Создает и выполняет одноразовое действие, которое активируется после заданной задержки.
Используя ScheduledExecutorService
, вы можете перезаписать свою программу следующим образом:
import java.util.concurrent.*;
public class Scratch {
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
System.out.println("Starting one-minute countdown now...");
ScheduledFuture<?> countdown = scheduler.schedule(new Runnable() {
@Override
public void run() {
// do the thing
System.out.println("Out of time!");
}}, 1, TimeUnit.MINUTES);
while (!countdown.isDone()) {
try {
Thread.sleep(1000);
System.out.println("do other stuff here");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
scheduler.shutdown();
}
}
Одна из приятных вещей, которые вы делаете, - это объект ScheduledFuture<?>
, который вы возвращаете из вызова schedule()
.
Это позволяет вам избавиться от дополнительной переменной boolean
и просто проверить, выполнялось ли задание.
Вы также можете отменить запланированную задачу, если не хотите больше ждать, вызывая метод cancel()
.
1 См. Java Timer vs ExecutorService? по причинам, чтобы избежать использования Timer
в пользу ExecutorService
.