ScheduledExecutorService заканчивается после тайм-аута
Добрый день! У меня есть планировщик, и мне нужно проверить, сколько времени он работает. Как я могу это сделать? Мне нужно вернуть ошибку от someFunction(), когда планировщик работает более 5 минут
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public int someFunction() {
ScheduledFuture<Integer> future =
scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS);
if (scheduler.isShutdown()) {
return future.get();
}
}
private class ScheduledPrinter implements Callable<Integer> {
public Integer call() throws Exception {
// do something
if (!serverResponse.getErrorData().equals("QueueIsNotReady")) {
scheduler.shutdown();
return getResponse();
}
return null;
}
}
1 ответ
Решение
Вы можете использовать следующие параметры:
scheduler.awaitTermination(5, TimeUnit.MINUTES)
ScheduledFuture<Integer> future = scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS); if (!scheduler.awaitTermination(5, TimeUnit.MINUTES)) { throw new Exception("task did not complete"); }
future.get(5, TimeUnit.MINUTES)
, Этот метод позволяет повторно использовать планировщик для других задач:ScheduledFuture<Integer> future = scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS); future.get(5, TimeUnit.MINUTES)); // this will throw TimeoutException after 5 minutes
Запланируйте выполнение другой задачи через 5 минут, которая проверит состояние первой задачи. Этот метод может использоваться для асинхронной обработки тайм-аута.
someFunction
немедленно вернется в этом случае:ScheduledFuture<Integer> future = scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS); scheduler.schedule(() -> { if (!future.isDone()) { future.cancel(true); // cancel task if it runs more than 5 minutes } }, 5, TimeUnit.MINUTES);