package com.fan.juc;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import javax.sound.midi.Instrument;
import org.junit.Test;
/**
* 分支合并框架
* @author fanfan
*
*/
public class TestForkJoinPool {
public static void main(String[] args) {
Long hh = System.currentTimeMillis();
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Long> task = new ForkJoinSumCalculate(0L,1000000000L);
Long sum = pool.invoke(task);
System.out.println(sum);
System.out.println(System.currentTimeMillis() - hh);
//18440
}
@Test
public void test1(){
Long hh = System.currentTimeMillis();
long sum = 0L;
for(int i = 0;i<1000000000L;i++){
sum += i;
}
System.out.println(sum);
System.out.println(System.currentTimeMillis());
}
}
class ForkJoinSumCalculate extends RecursiveTask<Long>{
private long start;
private long end;
private static final long THURSHOLD = 10000L; //临界值
public ForkJoinSumCalculate(long start,long end){
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
// TODO Auto-generated method stub
long length = end - start;
if(length <= THURSHOLD){
long sum = 0L;
for(long i = start;i<=end;i++){
sum += i;
}
return sum;
}else{
long middle = (start + end)/2;
ForkJoinSumCalculate left = new ForkJoinSumCalculate(start,middle);
left.fork(); //进行拆分,同时押入线程队列
ForkJoinSumCalculate right = new ForkJoinSumCalculate(middle+1,end);
right.fork();
return left.join()+right.join();
}
}
}
TestForkJoinPool
最新推荐文章于 2020-09-01 09:04:30 发布