У меня есть реализация Runnable
, которая выполняет некоторую работу, которая может занять некоторое время, и я пытаюсь запланировать ее с помощью ScheduledThreadPoolExecutor
с помощью метода scheduleAtFixedRate
. Теперь я хочу, чтобы закрытие было изящным, что означает, что перед завершением задача должна быть полностью запущена. Я написал следующий код для выключения.Подождите, пока задача завершится до завершения в ScheduledThreadPoolExecutor
public void shutDown() throws Exception {
try {
LOG.info("Gracefully shutting down executor");
executor.shutdown();
if (!executor.awaitTermination(SHUTDOWN_TIMEOUT, TimeUnit.SECONDS)) {
// cancels currently executing tasks.
LOG.info("Executor is still alive. Forcing executor thread pool to shut down");
executor.shutdownNow();
// Wait a while for tasks to respond to being cancelled
if (!executor.awaitTermination(SHUTDOWN_TIMEOUT, TimeUnit.SECONDS)) {
LOG.fatal("Executor thread pool did not terminate");
throw new Exception("Unable to shut down executor thread pool forcefully");
}
LOG.info("Executor shut down.");
}
} catch (Exception e) {
LOG.error("Exception shutting down executor", e);
throw e;
}
}
Но проблема состоит в том, что я должен указать время ожидания явно, и я не могу предсказать, время, потраченное на задачи заранее. Есть ли способ заставить исполнителя ждать неопределенно до тех пор, пока выполнение задачи не закончится, не говоря уже о времени ожидания? Или есть лучший способ работать над вышеупомянутым сценарием?
Благодаря
Jitendra
shutdown() должен сделать изящное окончание прав? в соответствии с документацией, shutdown() инициирует упорядоченное завершение работы, в котором выполняются ранее поставленные задачи, но новые задачи не будут приняты. Любая причина, по которой у вас есть другой код, связанный с awaitTermination (...); Вы хотите принудительно отключить, если он не завершен с определенным интервалом? – kosa
Я думаю, что он только инициирует выключение и завершает работу, не блокирует и не ждет, пока потоки не будут закрыты. – RandomQuestion
Мне нужен какой-то блокирующий вызов, чтобы я точно знал, когда задачи завершены – RandomQuestion