я начинаю изучать класс 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, работает, но у меня все еще есть проблемы.
В качестве последней проблемы я попытался немного изучить 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?
приветствуется любая помощь / руководство.