使用Fork/Join框架實現累加

package com.interview.thread;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class ForkJoinTest {
	
	public static void main(String[] args) {
		CalcTask task = new CalcTask(1,1000000000L);
		ForkJoinPool pool = new ForkJoinPool();
		Long result = pool.invoke(task);
		System.out.println(result);
	}
	
}
//使用fork/join並行計算累加任務
class CalcTask extends RecursiveTask<Long>{
	private static final long serialVersionUID = 1L;
	private long start;
	private long end;
	
	public CalcTask(long start, long end) {
		super();
		this.start = start;
		this.end = end;
	}

	@Override
	protected Long compute() {
		
		if((end-start) <= 10) {//不大於閾值,直接計算,不使用框架
			long sum = 0;
			for(long i=start;i<=end;i++) {
				sum+=i;
			}
			return sum;
		}else{//使用框架
			
			long mid = (start+end)/2;
			
			//拆分子任務
			CalcTask c1 = new CalcTask(start, mid);
			c1.fork();
			
			//拆分子任務
			CalcTask c2 = new CalcTask(mid+1, end);
			c2.fork();
			
			//合併
			return c1.join() + c2.join();
		}
		
	}
}

 

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