вызывая ExecutorService.shutDown () в java

я начинаю изучать класс ExecutorService. В документации (и онлайн-руководствах) говорится, что всегда нужно вызывать ExecutorService.shutDown () для восстановления ресурсов. однако в документации также говорится, что после вызова shutDown () никакие новые задачи не будут приниматься. Итак, мой вопрос: всегда ли мне нужно создавать экземпляр новой ExecutorService всякий раз, когда мне нужно распараллеливать обработку данных?

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

public void someMethod() {
 List<OuterCallable> outerCallables = getOuterCallables();
 ExecutorService executor = Executor.newFixedThreadPool(NUM_CPUS);
 executor.invokeAll(tasks);
 executor.shutDown();
}

Однако мой OuterCallable также разделяет данные или выполняет обработку данных параллельно с помощью InnerCallable.

public class OuterCallable implements Callable<Long> {
 public Long call() throws Exception {
  long result = 0L;

  List<InnerCallable> innerCallables = getInnerCallables();
  ExecutorServices executor = Executor.newFixedThreadPool(NUM_CPUS);
  executor.invokeAll(tasks);
  executor.shutDown();

  return result;
 }
}    

Я не могу вспомнить, было ли это для ExecutorService или подхода Fork / Join, но я помню документацию и учебные пособия, в которых говорилось, что фактическая параллельная процедура для управления данными не должна включать операции ввода-вывода, и все должно выполняться в памяти . однако в моем InnerCallable я фактически выполняю вызовы JDBC (здесь не показаны).

В конечном счете, способ, которым я использую ExecutorService, работает, но у меня все еще есть проблемы.

  1. мой подход выше хорошей практики программирования с использованием ExecutorService?
  2. следует ли мне использовать одноэлементный экземпляр ExecutorService?
  3. следует ли мне избегать не только операций ввода-вывода внутри моих параллельных методов, но также и вызовов JDBC?

В качестве последней проблемы я попытался немного изучить Fork / Join vs ExecutorService. я наткнулся на статью, которая полностью взорвала классы Fork / Join API /. стоит ли изучать Fork / Join? Я видел несколько статей о stackoverflow и в других местах, где тесты используются для сравнения Fork / Join и ExecutorService, и есть графики, показывающие лучшее использование ЦП Fork / Join vs ExecutorService (через диспетчер задач Windows). однако, когда я использую ExecutorService (JDK 1.7.x), моя загрузка ЦП максимальна. улучшился ли ExecutorService с помощью последней версии JDK?

приветствуется любая помощь / руководство.

7
задан Jane Wayne 27 February 2012 в 13:08
поделиться