誰かがフォーク/ジョインとは何かを説明できますか?
4 に答える
Fork Join は、並列分割統治アルゴリズム用の使いやすい API を備えた新しいフレームワークです。
この例では、複雑なアルゴリズムを持つ長時間実行されるタスクがあるとします。大きなタスクをフォークして、これら 2 つのタスクに取り組みたいと思うでしょう。ここで、これら 2 つのタスクがまだ大きすぎるとします。それぞれを 2 つのタスクにフォークします (この時点では 4 つです)。
各タスクが許容可能なサイズになるまでこれを続け、アルゴリズムを呼び出します。各タスクの呼び出しが並行して行われることを知っておくことが重要です。タスクが完了すると、フォークされた他のタスクと結合され、結果が統合されます。
これは、すべてのタスクが結合され、1 つのタスクが返されるまで続きます。
すでに述べたことに加えて、fork / joinは作業の盗用を利用します。実行することが不足しているスレッドは、まだビジー状態にある他のスレッドからタスクを盗むことができます。そして、FJの使用方法を理解するのに役立つ例を次に示します。
public class SumCounter extends RecursiveTask<Long> {
private final Node node;
public SumCounter(Node node) {
this.node = node;
}
@Override
protected Long compute() {
long sum = node.getValue();
List<ValueSumCounter> subTasks = new LinkedList<>();
for(Node child : node.getChildren()) {
SumCounter task = new SumCounter(child);
task.fork(); // run asynchronously
subTasks.add(task);
}
for(SumCounter task : subTasks) {
sum += task.join(); // wait for the result
}
return sum;
}
public static void main(String[] args) {
Node root = getRootNode();
new ForkJoinPool().invoke(new SumCounter(root));
}
}
処理する必要があるもののコレクションがあるとします。このコレクションのサブセットを取得して処理できるスレッドが多数あります。それらはすべてこれを同時に実行し(フォーク部分)、最後のものが終了するのを待ち(結合部分)、戻ってきます。