- シンプルな並列タスクのために「スレッド・プール+未来」プログラムによって解決することができます。
- CompletableFutureによって解決タスクの量(ANDまたはOR重合重合)との間の集約関係がある場合。
- CompletionServiceによって解決並列タスクの量。
分業、コラボレーション、相互に排他的:並行プログラミングの問題は3つのレベルに分けることができます。
用途は何ですかForkJoin
フォーク/参加対応参加し、この計算は、タスク分解モデルでタスクを分割するために対応するフレームワークフォーク、主パーティションタスクモデルをサポートするために、並列コンピューティングフレームワークで組み合わされた結果です。
分割統治とは何ですか
複雑な問題は、類似サブ問題、より小さなサブ問題を直接解決することが知られている単純な部分問題に分解し、サブ問題を複数に分解されます。
あずかるアルゴリズムフィールドルールアルゴリズムは、(ソート、クイックソートは分割統治法に属し、マージ、バイナリ検索も分割統治アルゴリズムである);のMapReduceも多数。
分割統治モデル
タスク分解、合併の結果:パーティションのタスクは、2つの段階に分けることができます。
フォーク/参加使用されています
フォーク/計算されたフレームに参加し、主に二つの部分、一つのパーティションForkJoinPoolタスクスレッドプールからなり、他の部分はパーティションタスクForkJoinTaskあります。スレッドプールにジョブを送信と同様のThreadPoolExecutorとのRunnable関係の2つの部分の間の関係を理解することができますが、パーティションはForkJoinTask独自のミッションの種類があります。
ForkJoinTask
- ForkJoinTaskは抽象クラスはサブタスクフォークの結果を待つために、現在のスレッドをブロックするコア()メソッドとjoin()メソッド、フォーク()非同期サブタスク、参加を(実行される)です。
- ForkJoinTaskも、サブカテゴリーがあります。
- RecursiveAction:タスクのパーティションに対処するための再帰的な方法で、計算()メソッドは値を返しません。
- RecursiveTask:タスク・パーティションに対処するための再帰的方法は、計算()メソッドは、値を返します。
ForkJoinTaskは、フィボナッチ数を計算する達成使用
package com.thread;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
* 实现斐波那契数列
* 求出第n个斐波那契数列值
**/
public class ForkJoinDemo {
public static void main(String[] args) {
//创建分治任务线程池
ForkJoinPool fjp = new ForkJoinPool(4);
//创建分治任务
Fibonacci fib = new Fibonacci(4);
//启动分治任务
Integer result = fjp.invoke(fib);
//输出结果
System.out.println(result);
}
static class Fibonacci extends RecursiveTask<Integer>{
final int n;
public Fibonacci(int n){
this.n = n;
}
@Override
protected Integer compute() {
if (n <= 1){
return n;
}
Fibonacci f1 = new Fibonacci(n-1);
//创建⼦任务
f1.fork();
Fibonacci f2 = new Fibonacci(n-2);
//等待子任务结果,并合并结果.
return f2.compute() + f1.join();
}
}
}复制代码
ThreadPoolExecutorとのRunnableの関係に似てForkJoinPoolとForkJoinTask関係。
キューの性質を盗むForkJoinPool、キューが忙しいアイドルタスクキューを盗みます
異なるForkJoinPoolでのコンピューティングタスクの異なるタイプの勧告を実施
コードワードは、あなたが私に懸念を与えるのを助けるために持っていることは容易ではない場合
愛の愛の生活技術のQQグループ:894 109 590