Fork/Join-Java並行計算架構

來源:互聯網
上載者:User

標籤:直接   interrupt   pen   execution   import   public   ret   問題   返回   

Java在JDK7之後加入了並行計算的架構Fork/Join,可以解決我們系統中大資料計算的效能問題。Fork/Join採用的是分治法,Fork是將一個大任務拆分成若干個子任務,子任務分別去計算,而Join是擷取到子任務的計算結果,然後合并,這個是遞迴的過程。子任務被分配到不同的核上執行時,效率最高。虛擬碼如下:

Result solve(Problem problem) {

    if (problem is small)

        directly solve problem

    else {

        split problem into independent parts

        fork new subtasks to solve each part

        join all subtasks

        compose result from subresults

    }

}

Fork/Join架構的核心類是ForkJoinPool,它能夠接收一個ForkJoinTask,並得到計算結果。ForkJoinTask有兩個子類,RecursiveTask(有傳回值)和RecursiveAction(無返回結果),我們自己定義任務時,只需選擇這兩個類繼承即可。
 
下面來看一個執行個體:計算一個超大數組所有元素的和。代碼如下:

import java.util.Arrays;

import java.util.Random;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ForkJoinPool;

import java.util.concurrent.RecursiveTask;

/**

 * @author: shuang.gao  Date: 2015/7/14 Time: 8:16

 */public class SumTask extends RecursiveTask<Integer> {

 

    private static final long serialVersionUID = -6196480027075657316L;

 

    private static final int THRESHOLD = 500000;

 

    private long[] array;

 

    private int low;

 

    private int high;

 

    public SumTask(long[] array, int low, int high) {

        this.array = array;

        this.low = low;

        this.high = high;

    }

 

    @Override

    protected Integer compute() {

        int sum = 0;

        if (high - low <= THRESHOLD) {

            // 小於閾值則直接計算

            for (int i = low; i < high; i++) {

                sum += array[i];

            }

        } else {

            // 1. 一個大任務分割成兩個子任務

            int mid = (low + high) >>> 1;

            SumTask left = new SumTask(array, low, mid);

            SumTask right = new SumTask(array, mid + 1, high);

 

            // 2. 分別計算

            left.fork();

            right.fork();

 

            // 3. 合并結果

            sum = left.join() + right.join();

        }

        return sum;

    }

 

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        long[] array = genArray(1000000);

 

        System.out.println(Arrays.toString(array));

 

        // 1. 建立任務

        SumTask sumTask = new SumTask(array, 0, array.length - 1);

 

        long begin = System.currentTimeMillis();

 

        // 2. 建立線程池

        ForkJoinPool forkJoinPool = new ForkJoinPool();

 

        // 3. 提交任務到線程池

        forkJoinPool.submit(sumTask);

 

        // 4. 擷取結果

        Integer result = sumTask.get();

 

        long end = System.currentTimeMillis();

 

        System.out.println(String.format("結果 %s 耗時 %sms", result, end - begin));

    }

 

    private static long[] genArray(int size) {

        long[] array = new long[size];

        for (int i = 0; i < size; i++) {

            array[i] = new Random().nextLong();

        }

        return array;

    }

}

Fork/Join-Java並行計算架構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.