码迷,mamicode.com
首页 > 编程语言 > 详细

Java 多线程 Fork/Join

时间:2019-04-08 13:50:11      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:over   ati   thread   接口   oid   desc   cte   博客   exec   

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

Java 多线程 Fork/Join

标签:over   ati   thread   接口   oid   desc   cte   博客   exec   

原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!