首页 > 其他分享 >forkJoin的使用

forkJoin的使用

时间:2023-08-25 18:33:53浏览次数:35  
标签:Fork Join 递归 ForkJoinPool 任务 线程 使用 forkJoin

原理:

定义:一个并行计算框架

用途:解决分治算法中的大规模任务。Fork/Join框架是基于工作窃取算法(work-stealing)的。

Fork/Join框架的核心概念有两个:

1.Fork(分割):将一个大任务,划分成多个相互独立且较小的子任务,这些子任务可以并行的执行。当一个任务被分割成多个子任务后,他们会进入到线程池的等待队列中等待执行。

2.Join(合并):等待子任务的执行结果,并将子任务的结果合并成一个整体结果。通常,在等待子任务时,线程会暂时挂起,执行其他可用的任务。

主要类:

ForkJoinPool,RecusiveTask(用于有返回值的任务),RecusiveAction(用于无返回值的任务)。

ForkJoinPool类的方法:

  1. ForkJoinPool(int parallelism):构造一个指定并行度(即线程数)的 ForkJoinPool 对象。
  2. submit(ForkJoinTask<T> task):提交一个 Fork/Join 任务给线程池进行执行,并返回一个 ForkJoinTask 对象,可用于获取任务的执行结果或取消任务。
  3. execute(ForkJoinTask<?> task):以异步无返回值的方式执行一个 Fork/Join 任务。
  4. invoke(ForkJoinTask<T> task):同步地执行一个 Fork/Join 任务,并返回任务的结果。
  5. awaitTermination(long timeout, TimeUnit unit):阻塞当前线程,直到所有提交的任务执行完毕或超时。
  6. shutdown():平缓地关闭线程池,等待已提交的任务完成执行。
  7. shutdownNow():立即关闭线程池,尝试中断正在执行的任务并返回未执行的任务列表。
  8. getParallelism():获取当前线程池的并行度(即线程数)。
  9. getPoolSize():获取当前线程池中正在活动的线程数。
  10. getActiveThreadCount():获取当前线程池中正在执行任务的线程数。
  11. getQueuedTaskCount():获取当前线程池等待执行的任务数。
  12. getStealCount():获取当前线程池中发生的工作窃取次数。

这些方法只是 ForkJoinPool 类中的一部分,它还提供了其他一些方法用于管理和监控 Fork/Join 任务的执行。通过使用这些方法,可以更好地控制和优化 Fork/Join 任务的并行执行效果。

示例:

package com.springBatch.demo.forkjoinDemo;

import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.concurrent.RecursiveTask;

@EqualsAndHashCode(callSuper = true)
@Data
public class FibonacciTask extends RecursiveTask<Integer> {

    //3.定义执行任务的阈值
    private final int n;


    //2.重写比较方法
    @Override
    protected Integer compute() {
        //4.
        if (n <= 1) {
            return n;
        } else {
            FibonacciTask f1 = new FibonacciTask(n - 1);
            f1.fork();
            FibonacciTask f2 = new FibonacciTask(n - 2);
            return f2.compute()+f1.join();
        }

    }
}
package com.springBatch.demo.forkjoinDemo;

import java.util.concurrent.ForkJoinPool;

public class Demo {
    public static void main(String[] args) {
        int n=10;
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        FibonacciTask fibonacciTask = new FibonacciTask(n);
        Integer result = forkJoinPool.invoke(fibonacciTask);
        System.out.println("第"+n+"个斐波那契数列是:"+result);

    }
}

附录:

  • 分治算法:
  • 将一个大的问题,划分成许多小的子问题,然后递归的解决这些问题,最后将这些子问题的解,合并起来,得到最终的结果。
  • 分治算法包含以下步骤:
  • 分解(Divide):将原来的任务,分解成若干个规模更小且相互独立的子问题。
  • 解决(Conquer):递归的解决每个子问题。如果子问题,足够小,无需进一步划分,直接求解。
  • 合并(Combine):将各个子问题的解合并起来,得到原始问题的解。
  • 递归:
  • 定义:一种算法或者函数的实现方式,通过调用自身来解决问题。函数在执行过程中,需要解决一个相同但规模更小的子问题时,他会再次调用自身,并将子问题作为参数,传递给自己。
  • 递归通常包含两个部分:
  • 递归基(Base case):也称终止条件。当满足某些条件时,递归就不再继续,即不再进行递归调用自身,而是返回一个确定的值,终止递归过程。
  • 递归步骤(Recursive step):递归本质上是将原始问题划分成多个相似的子问题,并将这些问题,用相同的过程解决,每次递归调用会处理规模更小的子问题,直到达到递归终止条件为止。

标签:Fork,Join,递归,ForkJoinPool,任务,线程,使用,forkJoin
From: https://blog.51cto.com/u_16205743/7234116

相关文章

  • 如何使用Chat Emy写代码
    首先,在使用ChatEmy写代码之前,你必须要先了解编程语言,也就是说,要有一点基础,然后才能够将ChatEmy给你写的东西应用起来,这一点是非常重要的,它生成的东西不能自动给你运行起来,只是能够提升你的效率或给你一定的帮助。一、如何使用ChatEmy写代码?在ChatEmy的广泛测试中,程序员们发......
  • Pandas 使用教程 CSV
    CSV(Comma-SeparatedValues,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。AttributeError:partiallyinitializedmodule'pandas'hasnoattribute......
  • Vue2.0中使用bpmn-js
      使用bpmn-js在网页中绘制流程图 1.新建vue项目,输入命令安装bpmn-jsnpminstallbpmn-js--save 2.在src/main.js中引入css样式//css样式import'bpmn-js/dist/assets/diagram-js.css'import'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'import'bpmn-js/di......
  • Linux基本命令使用
    Linux常用命令及使用方法基本命令1.ls,作用是列出目录下的内容, 语法如下:ls[-a-l-h][linux路径]-l:竖向排列展示内容  -a:列出所有文件夹,包含隐藏的ls-l-a / ls-la / ls-al三种写法都是一样的2.cd命令切换工作目录语法:cd+[linux路径]参数3.pwd查看当前......
  • 使用 Azure OpenAI 使用 C# 生成图像
    Microsoft启用使用AzureOpenAI生成映像的选项。在这篇文章中,我将向您展示如何轻松地使用RESTAPI通过人工智能生成图像,方法是用C#编写一个简单的控制台应用程序来连接到AzureOpenAI实例。介绍Microsoft引入了在AzureOpenAI服务中使用DALL-E生成映像的可能性。在......
  • 使用Webpack进行模块化开发与打包
    1.什么是WebpackWebpack是一个现代化的JavaScript模块打包工具,它可以将多个模块打包成一个或多个静态资源文件。通过Webpack,我们可以将项目中的各个模块进行模块化开发,并将它们打包成一个或多个可供浏览器加载的静态资源文件。2.Webpack的优势使用Webpack进行模块化开发与打包......
  • 在Vue3中使用 Pinia 保姆教程
    前言Vue3是Vue3是一款非常流行的JavaScript框架,它的出现为我们开发Web应用程序提供了更加高效和便捷的方式。在Vue3中,我们可以使用Pinia来进行状态管理,这是一个非常流行的状态管理库,它可以帮助我们更好地组织和管理应用程序的状态。在本文中,我们将探讨如何使用Vue3和Pinia,并持久化......
  • 使用Java Xpath 爬取某易云歌曲
    本文使用Javaxpath爬取某易云歌曲,并下载至本地。代码仅用于个人学习使用,欢迎各位大佬提出建议。1、添加依赖<dependency><groupId>cn.wanghaomiao</groupId><artifactId>JsoupXpath</artifactId><version>2.2</version>......
  • elementUI使用el-uplaod上传多个图片并删除部分图片
    前端界面:<el-form-itemlabel="商品轮播图":rules="[{required:true,message:'必须要上传图片',trigger:'blur'}]"prop="images"><el-uploadref=&q......
  • 编译和使用opencv
    之前编译过32位的opencv库,过了一段时间再次想编译64位的时候忘记怎么操作了,索性就记录下需要:opencv源码、cmake软件、python-3.11.3-amd64.exe1.用cmake设置好源码路径和生成路径并选择自己用的vs版本以及是x64或者x86就可以点击下面的generate进行生成了  2.生成之后得......