質問: threadPool.submit(task); futures.add(f); } // Wait for all sent tasks to complete: for (Future future : futures) { future.get(); } // Done! ``` タスクは、スレッドプールのキューに移動します。キューから、ワーカースレッドが使用可能になると実行されます。分割が十分に細かく(特に最後のタスクを待つことを避けるために)、スレッドプールに十分な(少なくともN個のプロセッサー)スレッドがある限り、すべてのプロセッサーは計算全体が完了するまで最高速度で動作します。 何か不足していますか?フォーク/結合フレームワークを使用することの付加価値は何ですか?
回答: (配列や配列の合計をソートする場合のように)他のスレッドが完了するのを待たなければならない問題がある場合は、Executor(Executors.newFixedThreadPool(2))が制限されているためにforkが使用されるべきですスレッド数。 forkjoinプールは、ブロックされたスレッドを覆い隠して同じ並列性を維持するために、この場合にはより多くのスレッドを作成します **Source:** エグゼキュータが分割および征服アルゴリズムを実装する際の問題は、サブタスクの作成には関係しません。なぜなら、Callableは、エグゼキュータに新しいサブタスクを自由に提出し、その結果を同期または非同期の方法で待機するからです。問題は並行処理の問題です:Callableが別のCallableの結果を待つとき、それは待機状態になり、実行のためにキューに入れられた別のCallableを処理する機会を無駄にします。 Doug Leaの努力によってJava SE 7のjava.util.concurrentパッケージに追加されたfork/joinフレームワークは、そのギャップを埋める **Source:** プールは、他のタスクへの参加を待っているタスクが停止した場合でも、内部ワーカースレッドを動的に追加、中断、または再開することによって、十分なアクティブ(または利用可能な)スレッドを維持しようとします。ただし、ブロックされたIOまたはその他の管理されていない同期にもかかわらず、そのような調整は保証されません public int getPoolSize() Returns the number of worker threads that have started but not yet terminated. **The result returned by this method may differ from getParallelism() when threads are created to maintain parallelism when others are cooperatively blocked.**