• Java 多线程 Fork/Join


    Fork/Join

    Fork/Join将大任务切分成小任务来分治运算,fork分join合。 一般直接使用ForkJoinTask的子类RecursiveTask。

    RecursiveTask的用法

    • 1.新建类A来继承RecursiveTask,实现compute()方法,这个方法就是需要分治的代码。其中,调用fork()方法来表示需要分解计算的内容,调用join()方法来获取结果
    • 2.新建ForkJoinPool,使用ForkJoinPool.submit(A的实例),来提交分治代码,并使用Future接口对象 f来接收接结果
    • 3.f.get()来获取最后的结果

    代码示例

    package JavaCore.MultiThread.advanced.ForkJoin;
    
    import java.util.concurrent.*;
    
    /*******************************************************************************
     * @Copyright (C), 2018-2019,github:Swagger-Ranger 
     * @FileName: Fibonacci
     * @Author: liufei32@outlook.com
     * @Date: 2019/3/13 12:34
     * @Description: Fibonacci的分治实现
     * @Aha-eureka:  一般斐波那契都是使用递归来写,其实这里使用分治效果会更好,因为可以使用多线程同时运算
     *******************************************************************************/
    
    public class Fibonacci extends RecursiveTask<Long> {
    
        final int n;
    
        Fibonacci( int n ) {
            this.n = n;
        }
    
        @Override
        protected Long compute() {
    
            if (n <= 1) {
                return 1L;
            } else {
                Fibonacci f1 = new Fibonacci(n - 1);
                Fibonacci f2 = new Fibonacci(n - 2);
                f1.fork();//进行分治运算
                return f2.compute() + f1.join();//join拿到结果
    
                /** 也可以这么写,但很明显上面的写法更加简洁
                Fibonacci f1 = new Fibonacci(n - 1);
                Fibonacci f2 = new Fibonacci(n - 2);
    
                f1.fork();
                f2.fork();
    
                return f1.join() + f2.join();
    
                 */
            }
        }
    
        public static void main( String[] args ) {
    
            Fibonacci fibonacci = new Fibonacci(5);
    
            ForkJoinPool forkJoinPool = new ForkJoinPool();
    
            Future<Long> future = forkJoinPool.submit(fibonacci);
    
            try {
                System.out.println(future.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
    
        }
    
    }
    
    

    本博客为Swagger-Ranger的笔记分享,文中源码地址: https://github.com/Swagger-Ranger
    欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com

  • 相关阅读:
    OpenLayers调用arcgis server发布的地图服务
    在线实用网址
    ArcGlobe点击IGlobeServerLayer图层读取信息
    vs2012编译出错“LC.exe”已退出解决方法
    DataTable反向模糊匹配查找语法
    PyCharm如何删除工程项目
    mysql错误日志目录
    下载HTMLTestRunner 地址
    python 单元测试之初次尝试
    cmd 运行 python
  • 原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669948.html
Copyright © 2020-2023  润新知