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: [email protected]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
欢迎交流指正,如有侵权请联系作者确认删除: [email protected]

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

时间: 2024-08-03 01:05:31

Java 多线程 Fork/Join的相关文章

java多线程中join用法

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. package com.wzs; /** * Java多线程中join用法 * * @author Administrator * */ public class JoinTest { public static void main(String[] args) { BThread bThread = new B

Java对多线程~~~Fork/Join同步和异步帧

于Fork/Join骨架,当提交的任务,有两个同步和异步模式.它已被用于invokeAll()该方法是同步的.是任何 务提交后,这种方法不会返回直到全部的任务都处理完了.而还有还有一种方式,就是使用fork方法,这个是异步的.也 就是你提交任务后,fork方法马上返回.能够继续以下的任务. 这个线程也会继续执行. 以下我们以一个查询磁盘的以log结尾的文件的程序样例来说明异步的使用方法. package com.bird.concursey.charpet8; import java.io.Fi

Java Concurrency - Fork/Join Framework

Normally, when you implement a simple, concurrent Java application, you implement some Runnable objects and then the corresponding Thread objects. You control the creation, execution, and status of those threads in your program. Java 5 introduced an

Java的Fork/Join任务

当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成小任务需要在任务执行的过程中动态拆分.这样,大任务可以拆成小任务,小任务还可以继续拆成更小的任务,最后把任务的结果汇总合并,得到最终结果,这种模型就是Fork/Join模型. Java7引入了Fork/Join框架,我们通过RecursiveTask这个类就可以方便地实现Fork/Join模式. 例如,对一个

多线程-Fork/Join

Fork/Join Java7提供了Fork/Join来支持将一个任务拆分成多个"小任务"并行计算,再把多个"小任务"的结果合并成总的计算结果. 类图 Java7提供了ForkJoinPool来支持将一个任务拆分为多个小任务并行计算,再把多个小任务的结果合并成总的计算结果.ForkJoinPool是ExecutorService的实现类,因此是一种特殊的线程池. ForkJoinPool(int n)创建一个包含n个并行线程的ForkJoinPool ForkJoi

Java多线程中join、yield、sleep方法详解

在Java多线程编程中,Thread类是其中一个核心和关键的角色.因此,对该类中一些基础常用方法的理解和熟练使用是开发多线程代码的基础.本篇主要总结一下Thread中常用的一些静态方法的含义及代码中的使用. sleep方法 源码如下: /** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subje

Java使用Fork/Join框架来并行执行任务

现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这种多核CPU做好准备,因此并不能很好地利用多核CPU的性能优势. 为了充分利用多CPU.多核CPU的性能优势,级软基软件系统应该可以充分“挖掘”每个CPU的计算能力,决不能让某个CPU处于“空闲”状态.为此,可以考虑把一个任务拆分成多个“小任务”,把多个"小任务"放到多个处理器核心上并行执

我的Java开发学习之旅------&gt;Java使用Fork/Join框架来并行执行任务

现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这种多核CPU做好准备,因此并不能很好地利用多核CPU的性能优势. 为了充分利用多CPU.多核CPU的性能优势,级软基软件系统应该可以充分"挖掘"每个CPU的计算能力,决不能让某个CPU处于"空闲"状态.为此,可以考虑把一个任务拆分成多个"小任务",把

Java多线程学习:Join()

方法join的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程Z进行无限期的阻塞,等待线程X销毁后再继续执行线程Z后面的代码.一般用于子线程先执行完毕再继续执行主线程的情况. 但是join方法后面的代码会不会提前执行呢?看下面的代码 1 public class ThreadA extends Thread { 2 3 private ThreadB threadB; 4 5 public ThreadA(ThreadB threadB) { 6 super(); 7 thi