Я использую 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.
Мне нужно что-то между этими двумя параметрами.
Я хочу вызвать команду, которая:
а. Завершает текущую активную задачу или задачи (например, shutdown
).
б. Завершает обработку ожидающих задач (например, shutdownNow
).
Например: предположим, что у меня есть ThreadPoolExecutor с 3 потоками. В настоящее время у него 50 задач в очереди, при этом первые 3 активно работают. Я хочу, чтобы эти 3 активные задачи были завершены, но я не хочу, чтобы остальные 47 задач запускались.
Я считаю, что я могу завершить работу ExecutorService таким образом, сохранив список объектов Future
, а затем вызывая cancel
для всех них. Но поскольку задачи передаются в этот ExecutorService из нескольких потоков, не было бы чистого способа сделать это.
Я действительно надеюсь, что мне не хватает чего-то очевидного или что есть способ сделать это чисто.
Спасибо за любую помощь.