iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解Java 并发编程中的ForkJoin框架
  • 511
分享到

如何理解Java 并发编程中的ForkJoin框架

2023-06-25 16:06:41 511人浏览 泡泡鱼
摘要

如何理解Java 并发编程中的ForkJoin框架,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、什么是ForkJoin框架ForkJoin框架是java的JU

如何理解Java 并发编程中的ForkJoin框架,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1、什么是ForkJoin框架

ForkJoin框架是java的JUC包里提供的,用于处理一些比较繁重的任务,会将这个大任务分为多个小任务,多个小任务处理完成后会将结果汇总给Result,体现的是一种“分而治之”的思想。第一步,拆分fork任务,将大任务分为多个小任务;第二步,归并join,会将小任务的处理结果进行归并为一个结果。

如何理解Java 并发编程中的ForkJoin框架

2、ForkJoinTask

ForkJoinTask是ForkJoin框架的提供的任务api,ForkJoinTask是一个抽象类,有两个主要的实现类,RecursiveTask和RecursiveAction,其中RecursiveTask和RecursiveAction的主要区别是,RecursiveAction没有返回值,而RecursiveTask是有返回值的

如何理解Java 并发编程中的ForkJoin框架

3、ForkJoinPool

ForkJoinPool类是forkjoin框架的线程池实现,基于ExecutorService接口。这个线程池是jdk1.7才加入的,用于管理线程,执行forkjoin的任务。对于线程池的使用,我们使用ThreadPoolExecutor比较多,可以在idea里看一下uml类图,可以看出ForkJoinPool和ThreadPoolExecutor实现差不多的。

如何理解Java 并发编程中的ForkJoin框架

ForkJoinPool()ForkJoinPool(int parallelism)ForkJoinPool(int parallelism, ForkJoinWorkerThreadFactory factory, UncaughtExceptionHandler handler, boolean asyncMode)

几个重要的参数:

  • parallelism:并行度,并行执行线程,可用指定,也可以不指定,不指定的情况,是根据cpu核数创建可用的线程

  • ForkJoinWorkerThreadFactory:创建线程的工厂实现

  • UncaughtExceptionHandler :因为未知异常中断的回调处理

  • asyncMode:是否异步,默认情况是false

使用时候,可以直接创建ForkJoinPool,可以不传参,不传参的情况,默认指定的线程并行数为Runtime.getRunTime().availableProcessors();,表示根据cpu核数创建可用线程数

ForkJoinPool forkJoinPool = new ForkJoinPool();ArraySortTask task = new ArraySortTask(array , 0 , size);forkJoinPool.submit(task);task.get();

也是可用传参,对并行度进行指定的public ForkJoinPool(int parallelism), parallelism并行度,并行执行几个线程

将forkjoin任务加入到FrokJoinPool线程池有几种方式

  • execute():调用其 fork 方法在多个线程之间拆分工作。

  • invoke():在ForkJoinPool线程池上调用invoke方法

  • submit():返回一个Future对象,Future可以进行监控,任务完成后返回结果

4、打印斐波那契数列

ForkJoin框架可以用于一些递归遍历的场景,对于斐波那契数列,你可以比较熟悉,因为在面试中有时候经常问到,斐波那契数列的特点就是最后一项的结果等于前面两项的和

package com.example.concurrent.forkjoin;import java.util.concurrent.ExecutionException;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.ForkJoinTask;import java.util.concurrent.RecursiveTask;public class Fibonacci extends RecursiveTask<Integer>{    private int n;    public Fibonacci(int n) {        this.n = n;    }    @Override    protected Integer compute() {        if (n <= 1)            return n;        Fibonacci f1 = new Fibonacci(n - 1);        f1.fork();        Fibonacci f2 = new Fibonacci(n - 2);        f2.fork();        return f1.join() + f2.join();    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        ForkJoinPool pool = new ForkJoinPool();        for (int i = 0; i< 10; i++) {            ForkJoinTask task = pool.submit(new Fibonacci(i));            System.out.println(task.get());        }    }}

5、ForkJoin归并排序

面试题:快速实现对一个长度百万的数组的排序

难点:可以使用归并排序,多线程如何组织实现归并排序

package com.example.concurrent.forkjoin;import java.util.Arrays;import java.util.Random;import java.util.concurrent.ExecutionException;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.RecursiveAction;public class ArraySortTask extends RecursiveAction{    final long[] array; final int lo, hi;    ArraySortTask(long[] array, int lo, int hi) {        this.array = array; this.lo = lo; this.hi = hi;    }    ArraySortTask(long[] array) { this(array, 0, array.length); }    @Override    protected void compute() {        if (hi - lo < THRESHOLD)            // 少于阀值,使用Arrays.sort 快排            sortSequentially(lo, hi);        else {                        // 取中间值            int mid = (lo + hi) >>> 1;            // 拆分任务            invokeAll(new ArraySortTask(array, lo, mid),                    new ArraySortTask(array, mid, hi));            // 归并结果            merge(lo, mid, hi);        }    }    // implementation details follow:    static final int THRESHOLD = 1000;    void sortSequentially(int lo, int hi) {        Arrays.sort(array, lo, hi);    }    void merge(int lo, int mid, int hi) {        long[] buf = Arrays.copyOfRange(array, lo, mid);        for (int i = 0, j = lo, k = mid; i < buf.length; j++)            array[j] = (k == hi || buf[i] < array[k]) ?                    buf[i++] : array[k++];    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        int size = 10_000;        long[] array = new long[size];        Random random = new Random();        for (int i = 0; i< size; i++) {            array[i] = random.nextInt();        }        ForkJoinPool forkJoinPool = new ForkJoinPool();        ArraySortTask task = new ArraySortTask(array , 0 , size);        forkJoinPool.submit(task);        task.get();        for (long a : array) {            System.out.println(a);        }    }}

关于如何理解Java 并发编程中的ForkJoin框架问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 如何理解Java 并发编程中的ForkJoin框架

本文链接: https://www.lsjlt.com/news/306225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解Java 并发编程中的ForkJoin框架
    如何理解Java 并发编程中的ForkJoin框架,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、什么是ForkJoin框架ForkJoin框架是java的JU...
    99+
    2023-06-25
  • Java 并发编程之ForkJoin框架
    目录1、什么是ForkJoin框架2、ForkJoinTask3、ForkJoinPool4、打印斐波那契数列5、ForkJoin归并排序总结 1、什么是ForkJoin框架 For...
    99+
    2022-11-12
  • Java并发编程之Fork/Join框架的理解
    一、Fork/Join框架的理解 ForkJoinTask类属于java.util.concurrent 包下; ForkJoinTask类下有2个子类,分别为R...
    99+
    2022-11-12
  • Java并发编程之Fork/Join框架的示例分析
    这篇文章主要介绍了Java并发编程之Fork/Join框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Fork/Join框架的理解ForkJoinTask类属...
    99+
    2023-06-15
  • Java并发中的Fork/Join 框架机制详解
    什么是 Fork/Join 框架 Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特...
    99+
    2022-11-12
  • Laravel框架中的同步编程:Python并发编程的启示
    Laravel是一款优秀的PHP框架,可以帮助开发者快速构建高质量的Web应用程序。在Laravel框架中,同步编程是非常常见的,它是指在一个任务完成之前,程序会一直等待这个任务完成之后才会进行下一个任务。然而,在一些特殊情况下,同步编程...
    99+
    2023-09-16
    并发 同步 laravel
  • 如何深入理解Java多线程与并发框中的CAS
    如何深入理解Java多线程与并发框中的CAS,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CAS实现原理CAS 是 CompareAndSwap 的缩写,意思是...
    99+
    2023-06-05
  • Java多线程高并发中的Fork/Join框架机制详解
    1.Fork/Join框架简介 Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成...
    99+
    2022-11-12
  • Python并发编程中的同步机制详解:如何应用到Laravel框架中?
    Python并发编程是一种高级编程技术,可以用于提高程序的性能和响应能力。在多线程和多进程编程中,同步机制是非常重要的一部分。本文将详细介绍Python并发编程中的同步机制,并且探讨如何将其应用到Laravel框架中。 一、Python并...
    99+
    2023-09-16
    并发 同步 laravel
  • 如何分析Java的Fork/Join并发框架
    这篇文章将为大家详细讲解有关如何分析Java的Fork/Join并发框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天我就把自己对Fork/Join一些浅显的理解记录下来。1. Fork...
    99+
    2023-06-17
  • 如何深入理解Java多线程与并发框中的并发辅助工具类
    如何深入理解Java多线程与并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中线程的状态
    本篇文章给大家分享的是有关如何深入理解Java多线程与并发框中线程的状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 新建状态(New)万事万物都不是凭空出现的,线程也一...
    99+
    2023-06-05
  • Linux上的Java并发编程,如何利用Django框架实现高效应用?
    随着互联网的普及,高并发访问已经成为了一个常态。而Java作为目前最流行的编程语言之一,其并发编程能力得到了广泛的认可和使用。在Linux操作系统下,Java并发编程更是成为了众多应用程序的首选。 然而,对于Java开发者来说,如何在Li...
    99+
    2023-09-29
    并发 linux django
  • 如何深入理解Java多线程与并发框中的volatile关键字
    本篇文章为大家展示了如何深入理解Java多线程与并发框中的volatile关键字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。概念把对 volatile变量的单个读/写,看成是使用 同一个监视器锁 ...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中线程和进程的区别
    如何深入理解Java多线程与并发框中线程和进程的区别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。线程和进程的区别1. 资源调度单位在计算机中,进程是程序运行所...
    99+
    2023-06-05
  • Spring框架如何优化Java中的异步编程?
    随着互联网的快速发展,用户对于响应速度的要求也越来越高。因此,在开发Web应用程序时,异步编程成为了不可或缺的技术。Spring框架作为Java开发中最受欢迎的框架之一,也在异步编程方面提供了很好的支持。本文将介绍Spring框架在Jav...
    99+
    2023-08-08
    对象 异步编程 spring
  • 并发编程中如何使用Java中的锁?
    并发编程中如何使用Java中的锁? 在Java中,锁是一种用来控制多个线程访问共享资源的机制。锁可以保证在同一时刻只有一个线程可以访问共享资源,从而避免多个线程同时修改数据导致的数据不一致问题。Java中的锁可以分为两种类型:内置锁和显式锁...
    99+
    2023-08-28
    numy shell 并发
  • Linux下的Java并发编程,你需要知道的Django框架集成技巧
    在当今的软件开发中,Java并发编程和Django框架集成技巧是非常重要的技能。本文将重点介绍在Linux系统下如何进行Java并发编程,并且分享一些Django框架集成技巧。 一、Linux下的Java并发编程 Java是一门支持多线程...
    99+
    2023-09-29
    并发 linux django
  • java并发编程之深入理解Synchronized的使用
    1.为什么要使用synchronized 在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只...
    99+
    2022-11-12
  • Java编程算法中,如何充分发挥关键字框架的优势?
    Java作为一种高级编程语言,拥有着强大的算法编程能力。在Java编程中,关键字框架是一种很重要的概念,它可以帮助程序员更好地组织代码,提高代码的可读性和可维护性。那么,在Java编程算法中,如何充分发挥关键字框架的优势呢?下面,我们将从以...
    99+
    2023-08-19
    编程算法 关键字 框架
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作