Я использую ExecutorService (ThreadPoolExecutor) для выполнения (и постановки в очередь) большого количества задач. Я пытаюсь написать код завершения работы, который был бы настолько изящным, насколько это возможно.
ExecutorService имеет два способа завершения работы:
ExecutorService.shutdown()
и затем ExecutorService.awaitTermination(...)
. ExecutorService.shutdownNow()
. Согласно JavaDoc, команда shutdown
:
Initiates an orderly shutdown in which previously submitted
tasks are executed, but no new tasks will be accepted.
И команда shutdownNow
:
Attempts to stop all actively executing tasks, halts the
processing of waiting tasks, and returns a list of the tasks that were
awaiting execution.
Мне нужно что-то среднее между этими двумя вариантами.
Я хочу вызвать команду, которая:
a. Завершает текущую активную задачу или задачи (как shutdown
).
b. Приостанавливает обработку ожидающих задач (например, shutdownNow
).
Например: предположим, у меня есть ThreadPoolExecutor с 3 потоками. В настоящее время у него 50 задач в очереди, причем первые 3 активно выполняются. Я хочу позволить этим 3 активным задачам завершиться, но не хочу, чтобы остальные 47 задач запускались.
Я полагаю, что могу выключить ExecutorService таким образом, сохранив список объектов Future
, а затем вызвав cancel
на всех них. Но поскольку задания подаются на этот ExecutorService из нескольких потоков, чистого способа сделать это не будет.
Я очень надеюсь, что я упускаю что-то очевидное или что есть способ сделать это чисто.
Спасибо за любую помощь.