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);
10 個のスレッドで ThreadPoolExecutor を作成し、3000 個の Callable タスクが送信されたとします。これらのスレッドは、サブタスクの実行負荷をどのように共有していますか?
また、ForkJoin プールは同じユースケースでどのように異なる動作をしますか?