ForkJoinPool – специальный вид
ExecutorService (пулла потоков), который появился в Java с версии 7. Предназначен для выполнения рекурсивных задач.
Задача для сервиса представляется экземпляром класса
ForkJoinTask. В основном используются подклассы
RecursiveTask и
RecursiveAction, для задач с результатом и без соответственно. Аналогично интерфейсам
Callable и
Runnable обычного
ExecutorService.
Тело рекурсивной операции задается в реализации метода
compute() задачи
ForkJoinTask. Здесь же создаются новые подзадачи, и запускаются параллельно методом
fork(). Чтобы дождаться завершения выполнения задачи, на каждой форкнутой подзадаче вызывается блокирующий метод
join(), результат выполнения при необходимости агрегируется.
С точки зрения использования метод
ForkJoinTask.join() похож на аналогичный метод класса
Thread. Но в случае fork-join поток может на самом деле не заснуть, а переключиться на выполнение другой задачи. Такая стратегия называется
work stealing, и позволяет эффективнее использовать ограниченное количество потоков. Это похоже на переиспользование потоков
корутинах Kotlin (
green threads).
Примеры практического использования ForkJoinPool.