Из java-документов,
ForkJoinPool отличается от других видов ExecutorService главным образом тем, что использует перехват работы: все потоки в пуле пытаются найти и выполнить подзадачи, созданные другими активными задачами (в конечном итоге блокируя ожидание работы, если таковой не существует).
Это обеспечивает эффективную обработку, когда большинство задач порождают другие подзадачи (как это происходит с большинством задач ForkJoinTask). При установке для asyncMode значения true в конструкторах ForkJoinPools также может подходить для использования с задачами в стиле событий, которые никогда не объединяются.
После прохождения ниже Пример ForkJoinPool. В отличие от ThreadPoolExecutor, я не видел параметра для установки размера очереди. Я не понял, как работает механизм кражи ForkJoinPool.
//creating the ThreadPoolExecutor
ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 10, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3000), threadFactory, rejectionHandler);
Предположим, я создал ThreadPoolExecutor с 10 потоками и отправил 3000 вызываемых задач. Как эти потоки распределяют нагрузку по выполнению подзадач?
И как пул ForkJoin ведет себя по-разному для одного и того же варианта использования?