Fork/Join框架介绍
下面使用该框架计算0-50000000000的和,并比较普通计算方法、Fork/Join框架、Java8新特性三种计算方式的计算时间:
1 import java.time.Duration; 2 import java.time.Instant; 3 import java.util.concurrent.ForkJoinPool; 4 import java.util.concurrent.ForkJoinTask; 5 import java.util.concurrent.RecursiveTask; 6 import java.util.stream.LongStream; 7 8 import org.junit.Test; 9 10 public class TestForkJoinPool {11 12 public static void main(String[] args) {13 Instant start = Instant.now();14 ForkJoinPool pool = new ForkJoinPool();15 ForkJoinTasktask = new ForkJoinSumCalculate(0L, 50000000000L);16 Long sum = pool.invoke(task);17 System.out.println(sum);18 Instant end = Instant.now();19 System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());//1059020 }21 22 @Test23 public void test1(){24 Instant start = Instant.now();25 long sum = 0L;26 for (long i = 0L; i <= 50000000000L; i++) {27 sum += i;28 }29 System.out.println(sum);30 Instant end = Instant.now();31 System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());//1570432 }33 34 //java8 新特性35 @Test36 public void test2(){37 Instant start = Instant.now();38 Long sum = LongStream.rangeClosed(0L, 50000000000L)39 .parallel()40 .reduce(0L, Long::sum);41 System.out.println(sum);42 Instant end = Instant.now();43 System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());//811844 }45 }46 47 class ForkJoinSumCalculate extends RecursiveTask {48 49 private static final long serialVersionUID = -259195479995561737L;50 51 private long start;52 private long end;53 private static final long THURSHOLD = 10000L; //临界值54 public ForkJoinSumCalculate(long start, long end) {55 this.start = start;56 this.end = end;57 }58 59 @Override60 protected Long compute() {61 long length = end - start;62 if(length <= THURSHOLD){63 long sum = 0L;64 for (long i = start; i <= end; i++) {65 sum += i;66 }67 return sum;68 }else{69 long middle = (start + end) / 2;70 ForkJoinSumCalculate left = new ForkJoinSumCalculate(start, middle); 71 left.fork(); //进行拆分,同时压入线程队列72 ForkJoinSumCalculate right = new ForkJoinSumCalculate(middle+1, end);73 right.fork(); //74 return left.join() + right.join();75 }76 }77 }
转载自:http://blog.csdn.net/xiangwanpeng/article/details/54977709