В чем разница между отменой периодической задачи через будущее и отключением службы-исполнителя, из которой поступила задача?

Разница между:

A)

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
 ScheduledFuture<> periodicTask = executorService.scheduleAtFixedRate(() -> {
            try {
                doSomething();
            } catch (Exception e) {
                log.error("Unhandled exception caught whilst doing minutely run", e);
            }
        }, initialDelay, PERIOD, TimeUnit.MILLISECONDS);

// In a shutdown hook:
periodicTask.cancel(true);

Это отменяет все запущенные задачи? Убивает ли это ExecutorService?

Б) Другой способ:

executorService.shutdown();
executorService.awaitTermination(....);

Какая разница?

Кроме того, как мне узнать, сколько задач в будущем планирует executorservice?

Как только я получаю сигнал о завершении работы, я просто хочу запустить запланированную задачу еще 2-3 раза, пока не достигну определенного состояния. После этого я хочу убить его.


person aaronv    schedule 12.04.2016    source источник
comment
Один отключает пул потоков, а другой нет.   -  person Peter Lawrey    schedule 12.04.2016


Ответы (1)


periodicTask.cancel(true);

Метод отмены только останавливает незапущенные задания и прерывает работающий поток, который затем должен вернуться из метода run().

executorService.shutdown();

Метод shutdown() не позволяет клиентам отправлять дополнительную работу службе-исполнителю. Это означает, что все существующие задачи будут выполняться до завершения.

executorService.awaitTermination(....);

Это помогает корректно завершить работу приложения. т. е. служба-исполнитель больше не выполняет работу и ждет, пока все выполняемые задания закончатся, а затем отключится.

person Praveen Kumar    schedule 12.04.2016