深度解析:Fork/Join框架

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

 

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