JDK1.7新特性(二)Fork/Join框架demo

記錄與分享,你我共成長 -from caicongyang

1.Fork/Join

  分解(Fork)操作:當需要將一個任務拆分成更小的多個任務時,在框架中執行這些任務;
  合併(Join)操作:當一個主任務等待其創建的多個子任務的完成執行;

2.核心類


ForkJoinPool:這個類實現了ExecutorService接口和工作竊取算法(Work-Stealing Algorithm)。它管理工作者線程,並提供任務的狀態信息,以及任務的執行信息。
ForkJoinTask:這個類是一個將在ForkJoinPool中執行的任務的基類。Fork/Join框架提供了在一個任務裏執行fork()和join()操作的機制和控制任務狀態的方法。通常,爲了實現Fork/Join任務,需要實現一個以下兩個類之一的子類。
RecursiveAction:用於任務沒有返回結果的場景。
RecursiveTask:用於任務有返回結果的場景。

3.demo

實現一個1..n的整數相加的demo

package com.caicongyang.newfeatures;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
 * fork/join框架
 * @author Administrator
 *
 */
public class Test {
	public static void main(String[] args) {
		  ForkJoinPool pool = new ForkJoinPool();
		    
		    /**
		     * get()和join()有兩個主要的區別:
			 * join()方法同步返回,不能被中斷。如果你中斷調用join()方法的線程,這個方法將拋出InterruptedException異常。如果任務拋出任何未受檢異常,
			 * get()方法異步返回將返回一個ExecutionException異常,而join()方法將返回一個RuntimeException異常。
		     */
		    //同步返回結果
			//Future<Integer> result = pool.submit(new CountTask(0, 2000));
		    //System.out.println(result.get());
		    //異步返回結果
	    	CountTask task = new CountTask(0, 2000);
			pool.execute(task);
			pool.shutdown();
			Integer count = task.join();
			System.out.println(count);

	}
}

/**
 * 計算1..n相加總和的簡單demo
 * @author Administrator
 *
 */
class CountTask extends RecursiveTask<Integer>{
	 
    /**
	 * serialID
	 */
	private static final long serialVersionUID = 1L;
	//邊界值
	private static final int THRESHOLD = 50;
    private int start;
    private int end;
     
    public CountTask(int start, int end) {
        this.start = start;
        this.end = end;
    }
 
    @Override
    protected Integer compute() {
        int sum = 0;
        boolean canCompute = (end - start) <= THRESHOLD;
        if (canCompute) {
            for (int i = start; i <= end; i++)
                sum += i;
        } else {
            int mid = (start + end) / 2;
            CountTask t1 = new CountTask(start, mid);
            CountTask t2 = new CountTask(mid+1, end);
            t1.fork();
            t2.fork();
            sum = t1.join() + t2.join();
		}
        return sum;
    }
}


如果你覺得本文對你有幫助,可以掃描下面的微信二維碼,請我喝杯水咯! 





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章