ForkJoin
1.8 之后
大数据 Map reduce 把大任务拆分成小任务
如何使用ForkJoin 在大量数据时使用
-
forkjoinpool 来执行
-
forjoinPool.execute(ForkJoinTask task)
-
计算类要继承 ForkJoinTask
import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; import java.util.stream.LongStream; public class ForkJoining extends RecursiveTask { private Long start; private Long end; private Long temp =1000L; public ForkJoining(Long start, Long end) { this.start = start; this.end = end; } @Override protected Long compute() { if((end - start)>temp){ Long mid =(end +start)/2; //一分为二 ForkJoining task1= new ForkJoining(start,mid); ForkJoining task2= new ForkJoining(mid+1,end); task1.fork(); task2.fork(); return task1.join()+task2.join(); } else{ Long sum=0L; for (Long i = start; i < end; i++) { sum=sum+i; } return sum; } } }
class test{ public static void main(String[] args) throws ExecutionException, InterruptedException { // test01(); //15281 // test02(); //9957 test03(); //358 } //Common public static void test01(){ Long sum=0L; long start = System.currentTimeMillis(); for (Long i = 0L; i < 10_0000_0000; i++) { sum=sum+i; } long end = System.currentTimeMillis(); System.out.println("sum= "+sum+"Time: "+(end-start)); } //ForkJoin public static void test02() throws ExecutionException, InterruptedException { long start = System.currentTimeMillis(); ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJoinTask task =new ForkJoining(0L,10_0000_0000L); ForkJoinTask submit = forkJoinPool.submit(task); //提交任务 Long sum = submit.get(); //抛出结果 long end = System.currentTimeMillis(); System.out.println("sum= "+sum+"Time: "+(end-start)); } //Stream流 public static void test03(){ long start = System.currentTimeMillis(); long sum =LongStream.rangeClosed(0L,10_0000_0000L).parallel().reduce(0,Long::sum); long end = System.currentTimeMillis(); System.out.println("sum= "+sum+"Time: "+(end-start)); } }