Завершение вызова ScheduledExecutorService для бесконечного планирования - PullRequest
0 голосов
/ 21 ноября 2018

Я использую ScheduledExecutorService, который будет запускаться каждую минуту бесконечно

Может кто-нибудь сказать мне, когда вызывать выключение на ScheduledExecutorService

Я уже изучил Guava MoreExecutors.Это не работает, так как мне нужно заблокировать основной поток, чтобы другие потоки работали непрерывно

Вариант использования

У меня есть задача, которая постоянно контролирует систему для проверкидля задержки / сбоев.

Мне нужно периодически запускать эту задачу и настраивать сигналы тревоги Cloudwatch на ее основе.В идеале, я хотел бы, чтобы задача продолжала выполняться даже при пике задержки, потому что сигнал тревоги сработал бы

Итак, я использую ScheduledExecutorService для периодического планирования задач.

Я хочу знать идеальное место, где я бы назвал shutdown () в службе исполнителя

1 Ответ

0 голосов
/ 22 ноября 2018

В настоящее время фабричные методы в Executors возвращают экземпляр ScheduledThreadPoolExecutor 1 .По умолчанию ScheduledThreadPoolExecutor не будет продолжать выполнять периодические задачи после его выключения.Вы можете настроить это с помощью setContinueExistingPeriodicTasksAfterShutdownPolicy.

Устанавливает политику относительно продолжения выполнения существующих периодических задач, даже если этот исполнитель был shutdown.В этом случае выполнение будет продолжаться до тех пор, пока shutdownNow или политика не будет установлена ​​на false, когда он уже выключен.Это значение по умолчанию false.

Поскольку в действительности это деталь реализации, которую возвращает реализация ScheduledExecutorService фабричных методов Executors, вероятно, лучше создать ScheduledThreadPoolExecutor напрямую.

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
executor.scheduleAtFixedRate(() -> System.out.println("Hello, World!"), 0L, 1L, TimeUnit.SECONDS);
executor.shutdown();

Обратите внимание, что в данный момент ScheduledThreadPoolExecutor настраивается на использование потоков non-daemon .Несмотря на то, что был вызван shutdown, если периодические задачи не отменены, они будут поддерживать JVM в рабочем состоянии.Используйте пользовательский ThreadFactory, если вы хотите использовать потоки демона.


1.Методы newSingleThreadScheduledExecutor возвращают ненастраиваемую оболочку , которая делегирует ScheduledThreadPoolExecutor.

...