并发编程(十二)ForkJoin框架使用

简介: 并发编程(十二)ForkJoin框架使用

所用较少,就不再分析太多了

ForkJoin框架使用

public class LongSum extends RecursiveTask<Long> {
    static final int SEQUENTIAL_THRESHOLD = 1000;
    int low;
    int high;
    int[] array;
    LongSum(int[] arr, int lo, int hi) {
        array = arr;
        low = lo;
        high = hi;
    }
    /**
     * fork()方法:将任务放入队列并安排异步执行,一个任务应该只调用一次fork()函数,除非已经执行完毕并重新初始化。
     * tryUnfork()方法:尝试把任务从队列中拿出单独处理,但不一定成功。
     * join()方法:等待计算完成并返回计算结果。
     * isCompletedAbnormally()方法:用于判断任务计算是否发生异常。
     */
    protected Long compute() {
        if (high - low <= SEQUENTIAL_THRESHOLD) {
            long sum = 0;
            for (int i = low; i < high; ++i) {
                sum += array[i];
            }
            return sum;
        } else {
            int mid = low + (high - low) / 2;
            LongSum left = new LongSum(array, low, mid);
            LongSum right = new LongSum(array, mid, high);
            left.fork();
            right.fork();
            long rightAns = right.join();
            long leftAns = left.join();
            return leftAns + rightAns;
        }
    }
}
public class LongSumMain {
  //获取逻辑处理器数量
  static final int NCPU = Runtime.getRuntime().availableProcessors();
  public static void main(String[] args) throws Exception {
    long start = System.currentTimeMillis();
    int[] array = new int[20000000];
    Random random = new Random();
    for (int i = 0; i < 20000000; i++) {
      array[i] = random.nextInt(100);
    }
    //采用fork/join方式将数组求和任务进行拆分执行,最后合并结果
    LongSum longSum = new LongSum(array, 0, array.length);
      ForkJoinPool forkJoinPool  = new ForkJoinPool(NCPU); //使用的线程数
    ForkJoinTask<Long> task = forkJoinPool.submit(longSum);
    System.out.println("forkjoin sum=" + task.get());
    if(task.isCompletedAbnormally()){
      System.out.println(task.getException().toString());
    }
    forkJoinPool.shutdown();
  }
}
目录
相关文章
layUI数据表格可编辑表格单元格值修改之后获取修改前的值
layUI数据表格可编辑表格单元格值修改之后获取修改前的值
664 0
|
自然语言处理 搜索推荐 Java
ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - 概述
205 0
|
机器学习/深度学习 搜索推荐 算法
云上智能推荐:重塑信息获取与消费的未来
市场竞争与合规性:随着云上智能推荐市场的不断扩大,市场竞争也日益激烈。如何在激烈的市场竞争中脱颖而出,同时遵守相关法律法规和行业标准,是系统开发者需要面对的重要问题。
|
存储 对象存储 Python
使用Python脚本快速批量删除OSS Bucket
要用Python删除OSS Bucket,似乎直接调用delete_bucket()方法就可以了。然而,在实际删除时,常常会遇到各种报错。这是因为OSS为了防止误操作,要求在删除Bucket之前必须清空其中的所有数据,包括对象(Objects)、多版本对象(Multi-version Objects)、碎片(Parts)、LiveChannels。针对需要快速批量删除OSS Bucket的场景,本文提供了一个Python脚本,用于先批量清除Bucket中的上述资源,然后再删除Bucket。
564 0
|
JSON 前端开发 Java
Spring Web MVC入门(2)——请求(上)
Spring Web MVC入门(2)——请求
155 0
|
存储 人工智能 Cloud Native
阿里云 Lindorm联合EMQ ,构建新一代 IoT 全链数据解决方案
近日,阿里云 Lindorm 云原生数据库团队与EMQ 核心研发团队共同宣布:双方联合推出的新一代 IoT 全链数据解决方案已成功完成验证!
302679 2
阿里云 Lindorm联合EMQ ,构建新一代 IoT 全链数据解决方案
|
BI 编译器 C语言
初识C语言一
初识C语言一
127 0
|
中间件 关系型数据库 MySQL
SpringCloud+Seata+nacos案例(包含源码 Seata及nacos安装教程)
SpringCloud+Seata+nacos案例(包含源码 Seata及nacos安装教程)
542 0
SpringCloud+Seata+nacos案例(包含源码 Seata及nacos安装教程)
|
数据可视化 JavaScript 前端开发
Apifox和Apipost哪个好?看完你就知道了
做完一轮竞品分析,我决定选择 Apifox 了。现在对于Apifox和Apipost哪个好?Apifox和Apipost有什么区别?这类问题,我想大家心里有数了
Apifox和Apipost哪个好?看完你就知道了
|
定位技术
【Axure教程】拖拉拽放大缩小和移动元件
【Axure教程】拖拉拽放大缩小和移动元件