2016-03-14 4 views
8

ScheduledExecutorService наследует два метода от ExecutorService, shutdown() и shutdownNow(). Разница между ними:Смесь выключения() и shutdownNow()

shutdown инициирует упорядоченное завершение работы, в котором выполняются ранее поставленные задачи, но новые задачи не будут приняты. Вызов не имеет дополнительного эффекта, если он уже выключен.

shutdownNow пытается остановить все активное выполнение задач, останавливает обработку ожидающих задач и возвращает список задач, ожидающих выполнения.

Теперь я хочу прекратить обработку ожидающих задач, пока я не хочу прерывать выполняемые в настоящее время задачи. Я не могу прерывать потоки, потому что сторонние библиотеки задействованы, и они не справляются с прерываниями :-(Но мне нужно отменить scheduled задачи, которые в настоящее время не выполняются, поскольку большинство из них запланировано через час или около того.

Что лучший способ справиться с этим Какие варианты есть ли у меня

+0

Комбинация 'shutdown' и [' awaitTermination'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination-long-java. util.concurrent.TimeUnit-) должен сделать трюк. – marcospereira

+0

@marcospereira 'awaitTermination' будет ждать завершения последней запланированной задачи. – steffen

ответ

4

Звучит как вызов setExecuteExistingDelayedTasksAfterShutdownPolicy(false) на вашем исполнителю следует сделать трюк:?

Устанавливает политику в отношении того, чтобы выполнить существующие с задержкой когда даже этот исполнитель был остановлен. В этом случае эти задачи будут завершение работы при завершении работы или после установки политики на значение false при завершении работы . По умолчанию это значение истинно.

Поскольку это true по умолчанию, эти задачи выполняются. Если вы установите его на false, они больше не должны исполняться. Это не следует путать с представленными задачами, к которым относятся ссылки, которые вы указываете. Они просто ждут очереди, которые будут выполнены сразу, когда есть свободный рабочий.

+0

Это один известный метод ... –

+0

Да, это отлично работает! Я забыл этот метод, так как он принадлежит 'ScheduledThreadPoolExecutor' и' Executors.newScheduledThreadPool (int) 'возвращает интерфейс ScheduledExecutorService. Теперь я сам создаю STPE. Благодаря! – steffen

Смежные вопросы