Лучший способ остановить ScheduledThreadPoolExecutor - PullRequest
1 голос
/ 04 июля 2019

Я использую одну ScheduledThreadPoolExecutor для управления несколькими задачами и хотел бы добавить опцию для их остановки.
Я понимаю разницу между shutdown и shutdownNow в обычной службе исполнителя и мне интересно понять, как онаповлияет на задачи в ScheduledThreadPoolExecutor - где задачи также планируется запускать через регулярные промежутки времени.
С учетом запущенного ScheduledThreadPoolExecutor, в котором есть как запущенные задачи, так и запланированные однократные задачи для запуска в будущем, а также задачикоторые запланированы для запуска с постоянным интервалом (один раз каждые X минут).Что будет лучшим способом для реализации следующих «команд»:

  1. Остановите все сейчас.Немедленно остановите все запущенные задачи. Не запускайте никакие задачи, которые были запланированы, но еще не запущены.
  2. В настоящее время запущенные потоки могут быть завершены при необходимости.Не запускайте задачи, которые уже запланированы, но еще не запущены.

Ответы [ 2 ]

3 голосов
/ 04 июля 2019
  1. Остановите все сейчас.Немедленно остановите все запущенные задачи. Не запускайте никакие задачи, которые уже были запланированы, но еще не запущены.

Вы можете использовать метод: public List<Runnable> shutdownNow(), но обратите внимание, что в настоящее время выполняетсятемы не могут немедленно прекратить.Если вы хотите сделать это, то вам нужно найти способ сообщить об убийстве процесса через отдельный поток или что-то в этом роде.

Из Javadocs: Нет никаких гарантий, кроме попыток изо всех сил прекратить обработку активно выполняемых задач.Эта реализация отменяет задачи через Thread.interrupt (), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.

Работающие в данный момент потоки могут быть завершены при необходимости.Не запускайте задачи, которые уже запланированы, но еще не запущены.

Этого можно достичь с помощью метода: public void shutdown()

Из Javadocs: Если для ExecuteExistingDelayedTasksAfterShutdownPolicy было установлено значение false, существующие отложенные задачи, задержки которых еще не истекли, отменяются.И если для ContinueExistingPeriodicTasksAfterShutdownPolicy не установлено значение true, будущие выполнения существующих периодических задач будут отменены.

1 голос
/ 04 июля 2019

Вы можете настроить это, используя

Итак, ваши два дела

  1. звонок shutdownNow
  2. установить для продолжения политику значение false, затем вызвать shutdown
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...