1. 程式人生 > >java7平行計算框架Fork/Join

java7平行計算框架Fork/Join

拆分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(); }