Я начинаю изучать класс ExecutorService.Документация (и учебные пособия онлайн) говорят всегда вызывать ExecutorService.shutDown () для восстановления ресурсов.однако в документации также сказано, что после вызова shutDown () новые задачи не принимаются.Итак, мой вопрос: всегда ли мне нужно создавать экземпляр нового ExecutorService всякий раз, когда мне нужно распараллелить обработку данных?
сейчас у меня есть список объектов Callable, и я делаю следующее.
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, работает, но у меня все еще есть проблемы.
- мой подход выше хорошей практики программирования с использованием ExecutorService?
- должен ли я использовать одноэлементный экземпляр ExecutorService?
- должен ли я не только избегать операций ввода-вывода внутри моих параллельных методов, но также и вызовов JDBC?
В качестве последней проблемы я пытался немного изучить Fork / Join vs ExecutorService.я наткнулся на статью, которая полностью взорвала API / классы Fork / Join.стоит ли изучать Fork / Join?Я видел несколько статей о стековом потоке и в других местах, где тесты используются для сравнения Fork / Join и ExecutorService, и есть графики, показывающие лучшее использование ЦП Fork / Join против ExecutorService (через диспетчер задач Windows).Тем не менее, когда я использую ExecutorService (JDK 1.7.x), загрузка моего процессора составляет макс.улучшен ли ExecutorService с последней версией JDK?
любая помощь / руководство приветствуется.