zoukankan      html  css  js  c++  java
  • Java 多线程 fork-join

    fork-join我们可以理解为分而治之,就是说当一个任务非常大的时候,我们可以按照一定的业务需求拆分为若干个小的任务,最后把这些小的任务再聚合起来。

    下面就通过fork-join实现一个从1加到100的多线程实现方式。

    首先定义类SumTask,必须继承RecursiveTask<Integer>,表示返回Integer类型。 

    private static class SumTask extends RecursiveTask<Integer> {
        private final static int THRESHOLD = 10;// 阀值,当数组长度小于10就不再拆分
        int[] array = null;
        int start;
        int end;
    
        public SumTask(int[] array, int start, int end) {
            this.array = array;
            this.start = start;
            this.end = end;
        }
    
        @Override
        protected Integer compute() {
            if (end - start <= THRESHOLD) {
                // 直接求和
                int sum = 0;
                for (int i = start; i <= end; i++) {
                    sum += this.array[i];
                }
                return sum;
            } else {
                // 拆分
                int mid = (start + end) / 2;
                SumTask left = new SumTask(array, start, mid);
                SumTask right = new SumTask(array, mid + 1, end);
                invokeAll(left, right);
                return left.join() + right.join();
            }
        }
    
    }

    然后主方法如下:

    public static void main(String[] args) {
        // 定义数组
        int[] arr = new int[100];
        for (int i = 0; i < 100; i++) {
            arr[i] = i + 1;
        }
    
        ForkJoinPool pool = new ForkJoinPool();
        SumTask innerFind = new SumTask(arr, 0, arr.length - 1);
        pool.invoke(innerFind);// 同步调用
        System.out.println("完成,结果是:" + innerFind.join());
    }

    注意:

    1.如果有返回值就继承RecursiveTask,没有返回值就继承RecursiveAction

    2.上面是同步调用,如果想要异步调用,可以使用pool.execute(...);替换上面的invoke方法

  • 相关阅读:
    [那些你所不知道的鬼畜写法]数据结构小探
    索引
    数据类型
    存储引擎
    事务
    视图、触发器、存储过程、自定义函数
    约束
    数据库介绍
    线程基础、线程池
    操作系统基础
  • 原文地址:https://www.cnblogs.com/duanjt/p/9705584.html
Copyright © 2011-2022 走看看