zoukankan      html  css  js  c++  java
  • java并发框架--Fork-Join

    并行计算


    Fork-Join

    关键类

    例子

    ``` package sumTest2; /** * 计算1-10000000的和 * 适用范围:计算不知道计算量大小的计算 */ import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask;

    public class SumTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    ForkJoinPool pool = new ForkJoinPool();

        SumTask task = new SumTask(1,10000000);//大任务
    
        ForkJoinTask<Long> result = pool.submit(task);
    
        //等待结果
    
        do {
            System.out.printf("Main: Thread Count: %d
    ",pool.getActiveThreadCount());//正在运行的线程
            System.out.printf("Main: Paralelism: %d
    ",pool.getParallelism());//并行度
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } while (!task.isDone());
        System.out.println(result.get().toString());
    }
    

    }

    ```java
    package sumTest2;
    
    import java.util.concurrent.RecursiveTask;
    //继承这个可以自动递归
    public class SumTask extends RecursiveTask<Long> {
    
        private int start;
        private int end;
    
        public SumTask(int start, int end) {
            this.start = start;
            this.end = end;
        }
        public static final int  Max= 5;
    
        @Override
        protected Long compute() {
            Long sum = 0L;
            boolean canCompute = (end - start)<= Max;
            if (canCompute){
                for (int i = start; i <= end; i++){
                    sum += i;
                }
            }else{
                int middle = (end + start) / 2;
                SumTask subTask1 = new SumTask(start, middle);
                SumTask subTask2 = new SumTask(middle+1, end);
    
                //invokeAll(subTask1, subTask2);
                subTask1.fork();
                subTask2.fork();
                Long sum1 = subTask1.join();
                Long sum2 = subTask2.join();
                sum = sum1 + sum2;
            }
            return sum;
        }
    }
    
    
    不一样的烟火
  • 相关阅读:
    建筑经济与企业管理 【1090】
    31 任意进制计数器的构成方法1
    30 同步计数器
    29 典型的时序电路模块2
    STM32的FSMC详解
    28 典型的时序电路模块1
    27 FSM,时序电路的分析方法
    26 电路结构和逻辑功能的关系
    25 触发器逻辑功能的分类
    24 触发器的电路结构和动作特点
  • 原文地址:https://www.cnblogs.com/cstdio1/p/12259652.html
Copyright © 2011-2022 走看看