Как с помощью Java ExecutorService завершить активно выполняющиеся задачи, но остановить обработку ожидающих задач?

Я использую ExecutorService (ThreadPoolExecutor) для выполнения (и постановки в очередь) большого количества задач. Я пытаюсь написать код завершения работы, который был бы настолько изящным, насколько это возможно.

ExecutorService имеет два способа завершения работы:

  1. я могу вызвать ExecutorService.shutdown() и затем ExecutorService.awaitTermination(...).
  2. Я могу вызвать 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 из нескольких потоков, чистого способа сделать это не будет.

Я очень надеюсь, что я упускаю что-то очевидное или что есть способ сделать это чисто.

Спасибо за любую помощь.

15
задан Jeff Goldberg 16 November 2011 в 20:51
поделиться