ForkJoinPool
используется для рекурсивных задач. Это такие задачи, которые можно делить на порции, подзадачи. Отделение подзадачи – это операция fork, финальная агрегация результатов подзадач – join.Реализация fork/join для самых популярных общих случаев уже есть в стандартной библиотеке, работать непосредственно с классом
ForkJoinPool
не потребуется. Метод parallelSetAll
из класса Arrays
применяет fork/join для генерации элементов массива; parallelPrefix
для модификации; parallelSort
для сортировки. Фреймворк неявно работает и в параллельных стримах. В этом случае логику fork определяет его сплитератор, а join выполняют потоковые операции. Классический пример:
Arrays.stream(new int[]{1, 2, 3, 4}).parallel().sum();
Существуют целые категории частных задач, решения которых хорошо параллелизуются: векторные операции, работа с графами, поиск данных. Для специфичных задач придется реализовывать собственные
RecursiveTask
, RecursiveAction
, или Spliterator
.