Как я могу получить задания, которые выполняются в ScheduledThreadPoolExecutor? - PullRequest
0 голосов
/ 03 августа 2011

Мне нужно форсировать освобождение ресурсов при прерывании задачи. Для этого я реализовал это решение . Но при этом, когда я вызываю shutdown(), все задачи в ScheduledThreadPoolExecutor.getQueue() выполняются правильно, но некоторые из моих работ сохранили ресурсы. Я очень хорошо проверил поведение и выяснил это: когда задача выполняется, его нет в очереди ScheduledThreadPoolExecutor (я знаю, это звучит очевидно). Проблема в том, что мне нужно принудительно высвободить ресурсы для всех заданий (в очереди или при выполнении)

Итак, как я могу получить задания, которые выполняются? У тебя есть идея получше?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

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

1 голос
/ 04 августа 2011

Разве вы не хотите вызывать

executor.shutdownNow()

, который попытается отменить запущенные в данный момент задачи (используя Thread.interrupt, поэтому вам нужно будет реализовать «политику прерывания» в каждой задаче, которая используетфлаг прерывания).

из javadoc

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

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

Это вернет список ожидающих задач, поэтому вы всегда можете вернуть его обратно.на «лист ожидания», а не потерять их полностью.Возможно, вы также захотите добавить «ожидание завершения», чтобы избежать запуска кода.Например, executor.awaitTermination(...).

tempus-fugit имеет несколько удобных классов для обработки этого.Вы просто звоните

shutdown(executor).waitingForShutdown(millis(400));

Подробнее см. здесь .

Также, решение, которое вы обрисовали в общих чертах в посте блога;Я не уверен, что это правильно.Future.cancel только остановит задачу от планирования.Если бы вы обновили пример в блоге, чтобы разрешить прерывание (т. Е. cancel(true), это будет эквивалентно (более или менее) с shutdownNow. То есть, он вызовет interrupt в основной задачекоторый (если вы внедрили политику прерывания) остановит ее обработку. Что касается очистки после прерывания, вам просто нужно убедиться, что вы обрабатываете это соответствующим образом в рамках реализации политики прерывания. В результате я думаю, что вы можете отменить и корректная очистка с использованием shutdownNow (или отмена (true))

...