Разве вы не хотите вызывать
executor.shutdownNow()
, который попытается отменить запущенные в данный момент задачи (используя Thread.interrupt
, поэтому вам нужно будет реализовать «политику прерывания» в каждой задаче, которая используетфлаг прерывания).
из javadoc
Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, ожидающих выполнения.
Нет никаких гарантий, кроме попыток изо всех сил прекратить обработку активно выполняемых задач.Например, типичные реализации будут отменены через Thread.interrupt, поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
Это вернет список ожидающих задач, поэтому вы всегда можете вернуть его обратно.на «лист ожидания», а не потерять их полностью.Возможно, вы также захотите добавить «ожидание завершения», чтобы избежать запуска кода.Например, executor.awaitTermination(...)
.
tempus-fugit имеет несколько удобных классов для обработки этого.Вы просто звоните
shutdown(executor).waitingForShutdown(millis(400));
Подробнее см. здесь .
Также, решение, которое вы обрисовали в общих чертах в посте блога;Я не уверен, что это правильно.Future.cancel
только остановит задачу от планирования.Если бы вы обновили пример в блоге, чтобы разрешить прерывание (т. Е. cancel(true)
, это будет эквивалентно (более или менее) с shutdownNow
. То есть, он вызовет interrupt
в основной задачекоторый (если вы внедрили политику прерывания) остановит ее обработку. Что касается очистки после прерывания, вам просто нужно убедиться, что вы обрабатываете это соответствующим образом в рамках реализации политики прерывания. В результате я думаю, что вы можете отменить и корректная очистка с использованием shutdownNow (или отмена (true))