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方法

  • 相关阅读:
    快速入门系列--MVC--07与HTML5移动开发的结合
    快速入门系列--WebAPI--01基础
    快速入门系列--CLR--02多线程
    MongoDB快速入门
    ubuntu 12.04 server编译安装nginx
    apache 正反向代理
    c# 继承,多态,new /overrid 区别, 引用父类的方法
    python 异步线程简单实现
    ubuntu上完全卸载package
    apache2:Invalid option to WSGI daemon process definition
  • 原文地址:https://www.cnblogs.com/duanjt/p/9705584.html
Copyright © 2011-2022 走看看