java7平行計算框架Fork/Join
阿新 • • 發佈:2019-02-10
拆分fork+合併join。jdk1.7整合Fork/Join,效能上有大大提升。
思想:充分利用多核CPU把計算拆分成多個子任務,平行計算,提高CPU利用率大大減少運算時間
當你在ForkJoinPool中執行ForkJoinTask時,你可以使用同步或非同步方式來實現。當你使用同步方式時,提交任務給池的方法直到提交的任務完成它的執行,才會返回結果。當你使用非同步方式時,提交任務給執行者的方法將立即返回,所以這個任務可以繼續執行。
你應該意識到這兩個方法有很大的區別,當你使用同步方法,呼叫這些方法(比如:invokeAll()方法)的任務將被阻塞,直到提交給池的任務完成它的執行。這允許ForkJoinPool類使用work-stealing演算法,分配一個新的任務給正在執行睡眠任務的工作執行緒。反之,當你使用非同步方法(比如:fork()方法),這個任務將繼續它的執行,所以ForkJoinPool類不能使用work-stealing演算法來提高應用程式的效能。在這種情況下,只有當你呼叫join()或get()方法來等待任務的完成時,ForkJoinPool才能使用work-stealing演算法。
非同步的簡單例項如下:
public class ForjoinTest extends RecursiveTask<Integer> {
private int start;
private int end;
public ForjoinTest(int start, int end) {
this.start = start;
this.end = end;
}
//計算
@Override
protected Integer compute() {
int sum = 0;
if (start - end < 100) {
for (int i = start; i < end; i++) {
sum += i;
}
} else {//間隔有100則拆分多個任務計算
int middle = (start + end) / 2;
ForjoinTest left = new ForjoinTest(start, middle);
ForjoinTest right = new ForjoinTest(middle + 1, end);
left.fork();
right.fork();
sum = left.join() + right.join();
}
return sum;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ForkJoinPool forkJoinPool = new ForkJoinPool();//對執行緒池的擴充套件
Future<Integer> result = forkJoinPool.submit(new ForjoinTest(1, 1000000));
System.out.println(result.get());
forkJoinPool.shutdown();
}