Fork me on GitHub

ForkJoinPool简单使用

简介

ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行,当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。

适用场景:最适合的是计算密集型的任务,如果存在 I/O,线程间同步,sleep() 等会造成线程长时间阻塞的情况。

代码

static int[] nums=new int[1000000];
     static final int MAX_NUM=500;
     static Random r=new Random();

     static {
         for (int i = 0; i < nums.length; i++) {
             nums[i]=r.nextInt(MAX_NUM);
         }
         System.out.println("nums总和为:-->"+ Arrays.stream(nums).sum());
     }

     /**
      *  继承RecursiveTask有返回值
      *
      *
      **/
     public static class AddTaskRet extends RecursiveTask<Long>{

         private static final long serialVersionUID = 1L;
         int start, end;

         AddTaskRet(int s, int e) {
             start = s;
             end = e;
         }

         @Override
         protected Long compute() {
             //如果计算的数小于500,则一个线程进行计算即可
             if(end-start <= MAX_NUM) {
                 long sum = 0L;
                 for(int i=start; i<end; i++){
                     sum += nums[i];
                 }
                 return sum;
             }
             //大于500,这里分成两个线程去进行计算
             int middle = start + (end-start)/2;
             AddTaskRet subTask1 = new AddTaskRet(start, middle);
             AddTaskRet subTask2 = new AddTaskRet(middle, end);
             //执行两个任务
             subTask1.fork();
             subTask2.fork();
             //把两个小任务累加的结果合并起来
             return subTask1.join() + subTask2.join();
         }
     }

     /**
      * 继承RecursiveAction,无返回值
      *
      *
      **/
     public static class AddTask extends RecursiveAction{
         int start, end;
         AddTask(int s, int e) {
             start = s;
             end = e;
         }

         @Override
         protected void compute() {
             if(end-start <= MAX_NUM) {
                 long sum = 0L;
                 for(int i=start; i<end; i++){
                     sum += nums[i];
                 }
                 System.out.println("from:" + start + " to:" + end + " = " + sum);
             } else {

                 int middle = start + (end-start)/2;

                 AddTask subTask1 = new AddTask(start, middle);
                 AddTask subTask2 = new AddTask(middle, end);
                 subTask1.fork();
                 subTask2.fork();
             }
         }
     }

     /**
      * @Description:
      * @Author: zhuyang
      * @Date: 2022/1/17 19:36
      * @return: void
      **/
     public void poolDemo(){
         ForkJoinPool fjp = new ForkJoinPool();
         AddTaskRet task = new AddTaskRet(0, nums.length);
         //进行执行任务
         fjp.execute(task);
         //获取结果
         long result = task.join();
         System.out.println("多任务分片执行结果为---->"+result);
     }

Gitee地址

https://gitee.com/zhuayng/foundation-study/blob/develop/JavaBasis/JUC/src/main/java/com/yxkj/juc/c_003/ForkJoinPoolDemo.java

posted @ 2020-04-20 16:31  晨度  阅读(4448)  评论(0编辑  收藏  举报