Skip to content
DAILY QUOTE

“ ”

什么是 ForkJoin

ForkJoin 在 JDK 1.7 , 并行执行任务!提高效率。大数据量!

大数据:Map Reduce (把大任务拆分为小任务)

ForkJoin 特点:工作窃取

这个里面维护的都是双端队列

ForkJoin

代码:

java
package com.mystpet.ForkJoinTest;  
  
import java.util.concurrent.ExecutionException;  
import java.util.concurrent.ForkJoinPool;  
import java.util.concurrent.ForkJoinTask;  
import java.util.concurrent.FutureTask;  
import java.util.stream.LongStream;  
  
/**  
 * 同一个任务,别人效率高你几十倍!  
 */  
  
public class Test {  
    public static void main(String[] args) throws ExecutionException, InterruptedException {  
//        test1();//4847  
//          test2();//1526  
        test3();//82  
    }  
  
    //普通程序员  
    public static void test1(){  
        Long sum=0L;  
        long start=System.currentTimeMillis();  
  
        for(Long i = 1L; i <= 10_0000_0000; i++){  
            sum=sum+i;  
        }  
        long end=System.currentTimeMillis();  
        System.out.println(("sum="+sum+"时间:"+(end-start)));  
    }  
  
    //会使用ForkJoin  
    public static void test2() throws ExecutionException, InterruptedException {  
        long start=System.currentTimeMillis();  
        //建立线程池  
        ForkJoinPool forkJoinPool=new ForkJoinPool();  
  
        //制造任务  
        ForkJoinTask<Long> task=new ForkJoinDemo(1L,10_0000_0000L);  
  
        //提交任务到线程池  
        ForkJoinTask<Long> submit=forkJoinPool.submit(task);  
        long sum=submit.get();  
        long end=System.currentTimeMillis();  
        System.out.println(("sum="+sum+"时间:"+(end-start)));  
  
    }  
  
    //stream并行流  
    public static void test3() throws ExecutionException, InterruptedException {  
        long start=System.currentTimeMillis();  
        long sum = LongStream  
                .rangeClosed(1L, 10_0000_0000L)  
                .parallel()  
                .reduce(0, Long::sum);  
        long end=System.currentTimeMillis();  
        System.out.println(("sum="+sum+"时间:"+(end-start)));  
    }  
}