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.