Fork/Join框架是一個用於並行執行任務的框架,它的出現是爲了適應多核處理器時代,提高cpu的利用率。核心思想是把一個大任務分割成若干個小任務,彙總每個小任務的結果作爲大任務的結果。Fork/Join框架要完成兩件事:
1、Fork(任務分割):就是將一個大任務分割成足夠小的子任務。
2、Join(執行任務併合並結果):分割的子任務會分別保存到雙端隊列裏,然後幾個啓動線程會到這個雙端隊列裏拿取任務並執行,執行的結果會保存到另一個隊列裏,之後會單獨啓動一個線程在隊列裏獲取數據,然後合併這些數據。
Fork/Join使用案例:(計算1~1000000的值,每個任務都執行相鄰的三個數相加,只要兩數之差大於等於2,就將這個任務再次拆分)
代碼:
package cn.skq.forkjoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;
class Demo extends RecursiveTask<Integer> {
private int begin;
private int end;
public Demo(int begin, int end) {
super();
this.begin = begin;
this.end = end;
}
private int sum;
@Override
protected Integer compute() {
if (end - begin <= 2) {
for (int i = begin; i <= end; i++) {
sum += i;
}
} else {
Demo a = new Demo(begin, (begin + end) / 2);
Demo b = new Demo((begin + end) / 2 + 1, end);
a.fork();//拆分任務
b.fork();//拆分任務
Integer aa = a.join();//執行任務併合並結果
Integer bb = b.join();//執行任務併合並結果
sum = aa + bb;
}
return sum;
}
}
public class Test {
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool();
Future<Integer> future = pool.submit(new Demo(1, 1000000));
try {
System.out.println(future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}