11 Fork/Join

news2024/12/23 0:15:24

1 分治思想

        分治思想:规模为N的问题分解为K个规模的子问题,子问题相互独立且与原问题性质相同,求出子问题的解,就能得到原问题的解

        分治思想的步骤:

                分解

                求解

                合并

2 Fork/Join

2.1 介绍

        并行计算框架,用来支持分治任务模型的,Fork对应的是分治任务模型里的任务分解Join对应的是结果合并

 2.2 应用场景

1 递归分解型任务

        排序、归并、遍历等,通常可以将大的任务分解成若干子任务

2 数组处理

        大型数组的排序、查找、统计等,拆成若干子数组,并行地处理每个子数组,最后合并成一个大的有序数组

3 并行化算法

        并行化图像处理算法、并行化机器学习算法等,将任务拆分成若干子问题

4 大数据处理

        大型日志文件处理、大型数据库查询等,将数据分成若干分片,并行处理每个分片

2.3 使用

主要组成:ForkJoinPool、ForkJoinTask

        ForkJoinPool:用于管理任务的执行

        ForkJoinTask:任务可以被分为得更小

使用步骤:

        1 构建一个任务,需要继承RecursiveAction(无返回值)或RecursiveTask(有返回值),重写compute()方法来实现任务的执行逻辑,在方法中最后调用invokeAll开始执行任务

        2 构建forkJoin线程池,调用forkJoin.invoke()来提交任务

2.3.1 ForkJoinPool

        用于管理Fork/Join任务的线程

        构造器

                

                int parallelism:指定并行级别,决定工作线程的数量,未设置则使用Runtime.getRuntime().availableProcessors()来设置并行级别

                ForkJoinWorkerThreadFactory:在创建线程时,通过该factory创建,未设置使用默认的DefaultForkJoinWorkerThreadFactory负责线程的创建

                UncaughtExceptionHandler:指定异常处理器,运气出错时会由设定的处理器处理

                asyncMode:队列的工作模式,true=先进先出,false=后进先出

        任务提交方式

                

         与普通线程池对比

                工作窃取算法:普通线程池采用任务队列实现;FockJoinPool中的线程在执行完任务后,可以从其它线程的队列获取任务并执行

                任务的分解和合并:ForkJoinPool可将一个大任务分解为多个小任务,并行地执行这些小任务,最终将其结果合并;而普通线程只能按提交的任务顺序一个一个地执行

                工作线程的数量:ForkJoinPool根据当前系统的CPU核心数来自动设置工作线程的数量,以最大限度地发挥CPU性能优势;普通线程需要手动设置线程池大小,且要考虑其合理性

                任务类型:ForkJoinPool适用于执行大规模任务并行化;普通线程池适用于执行一些短小的任务,如处理请求

2.3.2 ForkJoinTask

        定义执行任务的基本接口

        通过继承ForkJoinTask类来实现自己的任务类,重写其中的compute()方法来定义任务的执行逻辑,实现时只需继承其子类:

                RecursiveAction:递归执行但不需要返回结果

                RecursiveTask:递归执行需要返回的结果

                CountedCompleter:任务完成执行后,触发的自定义钩子函数

        调用方法

                fork() ---- 提交任务

                        向当前任务所运行的线程池中提交任务;当前线程是ForkJoinWorkerThread类型,会放入该线程的工作队列,否则放入common线程池的工作队列中

                join() ---- 获取任务执行结果

                        用于获取任务的执行结果;调用方法时,会阻塞当前线程直到对应的子任务完成运行并返回结果

2.3.3 处理递归任务

public class Fibonacci extends RecursiveTask<Integer> {

    final int n;

    public Fibonacci(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {
        if (n <= 1) {
            return n;
        }
        Fibonacci f1 = new Fibonacci(n - 2);
        f1.fork();
        Fibonacci f2 = new Fibonacci(n - 1);
        return f2.compute() + f1.join();
    }

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        Fibonacci fibonacci = new Fibonacci(100);
        Integer result = pool.invoke(fibonacci);
        System.out.println(result);
    }
}

        上述代码存在的问题:会导致程序运行时间长,递归深度过大时栈溢出等

        在使用ForkJoinPool处理递归任务时,特别要考虑递归深度和任务粒度,避免调度带来的内存消耗

2.3.4 处理阻塞任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1127371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROCESS SPID 代表什么进程

ROCESS 发出sql命令 所在主机的进程 可以不在数据库主机上发出 SPID 对应数据库的服务进程id select a.PROCESS,b.SPID From v$session a , v$process b where a.PADDRb.ADDR and a.USERNAMESYS SQL> !ps -ef|grep sqlplus oracle 385 2792 0 21:01 pts/…

继电器测试的方法和步骤有哪些?

继电器测试是一种常见的电气测试方法&#xff0c;用于检测继电器的工作状态和性能&#xff0c;下面是继电器测试的一般方法和步骤&#xff1a; 准备工作&#xff1a;确认测试设备的准备情况&#xff0c;包括测试仪器、电源、继电器和连接线等。确认继电器的工作原理和参数&…

IDEA: 个人主题及字体搭配推荐

文章目录 1. 字体设置推荐2. 主题推荐3. Rainbow Brackets(彩虹括号)4. 设置背景图片 下面是我的 IDEA 主题和字体&#xff0c;它们的搭配效果如下&#xff1a; 1. 字体设置推荐 在使用 IntelliJ IDEA 进行编码和开发时&#xff0c;一个合适的字体设置可以提高你的工作效率和舒…

Spring 最全Bean的加载和获取方式整理

目录 一、 前言二、Bean加载的九种方式1. XML配置方式2. XML注解配置方式3. 注解方式4. 使用Bean方式5. 使用Import方式6. 容器初始化完毕后注入bean7. 实现ImportSelector接口8. 实现ImportBeanDefinitionRegistrar接口9. 实现BeanDefinitionRegistryPostProcessor接口 三、Be…

Verilog功能模块——读写位宽不同的异步FIFO

前言 前面的博文已经讲了异步FIFO和同步FIFO&#xff0c;但并没有实现FIFO的读写位宽转换功能&#xff0c;此功能是FIFO的主要功能之一&#xff0c;应用十分广泛&#xff0c;因此&#xff0c;在前面两个模块的基础上&#xff0c;本文使用纯Verilog实现了读写位宽不同的FIFO&…

Plex踩坑——plex web无法找到媒体服务器

现象&#xff1a;之前安装过plex server&#xff0c;然后卸载了。再次重装后&#xff0c;plex web无法找到媒体服务器。 原因&#xff1a;卸载plex server时需要手动将plex的注册表删除&#xff1a;HKEY_CURRENT_USER\Software\Plex, Inc. 原文链接Uninstall Plex Media Serve…

又是一年1024,你还在做程序猿嘛

每年的10月24日&#xff0c;对于广大程序员来说&#xff0c;都有着特殊的意义。这一天是程序员节&#xff0c;一个属于这个独特群体的庆祝活动。在这个特别的日子里&#xff0c;我们不禁要问&#xff1a;又是一年1024&#xff0c;你还在做程序猿嘛&#xff1f; 程序员&#xff…

MATLAB——一维连续小波的分解

%% 学习目标&#xff1a;一维连续小波的分解 %% help wavelet 查询小波工具箱中的所有函数 %% wavedemo 查看案例 clear all; close all; load noissin.mat; %% which noissin.mat figure; subplot(211); plot(noissin); %信号的时域图 10…

【xxl-job】你与xxl-job仅差这个示例

文章目录 摘要介绍底层使用技术和实现原理分布式任务调度任务执行器分片任务任务调度中心 示例代码详解创建一个任务处理类补充配置文件启动xxl-job执行器&#xff0c;并在任务调度中心中添加一个定时任务在任务调度中心中添加一个定时任务&#xff0c;并选择刚刚创建的任务处理…

只要路由器有WPS按钮,佳能打印机连接到Wi-Fi网络的方法就很简单

佳能打印机是很好的设备&#xff0c;可以让你从智能手机、电脑或平板电脑打印照片。它们还提供其他功能&#xff0c;如扫描文档和复制图像。 最新的型号还允许你连接到Wi-Fi&#xff0c;因此你不需要使用电线将设备连接到打印机。 Wi-Fi是通过本地网络传输数据的标准方式。它…

rstudio server 服务器卡死了怎么办

#rstudio 卡死了怎么办 cd ~/.local/share/ ls rm -fr rstudio.old mv ~/.rstudio ~/.rstudio.oldcd ~/.config/ rm -fr .rstudio.old mv ~/.config/rstudio/ ~/.config/rstudio.oldps -ef|grep t040413 |grep rsession |awk {print $2}| xargs kill -9

itbuilder软件在线设计数据库模型,AI与数据库擦出的火花

今天要介绍一款强大的软件&#xff0c;它就是itBuilder软件&#xff0c;一款在线设计数据库模型软件&#xff0c;借助人工智能提高效率&#xff0c;可以生成CRUD代码并推送至开发工具中&#xff1b;它涵盖了几乎所有语言&#xff0c;如Java、Python、JavaScript等&#xff0c;并…

基于Python开源爬虫框架Scrapy租房信息爬取与数据展示工具

获取代码&#xff1a; 知识付费时代&#xff0c;低价有偿获取代码&#xff0c;请理解&#xff01; (1) 下载链接: 后发 (2) 添加博主微信获取&#xff08;有偿&#xff09;,备注来源: mryang511688 (3) 快速扫码咨询&#xff1a; 项目描述 技术&#xff1a;Python、Scrapy、Dj…

红海云签约深圳天使母基金,数智引领金融行业人力资源数字化转型

深圳市天使投资引导基金管理有限公司&#xff08;以下简称“深圳天使母基金”&#xff09;是深圳市人民政府投资发起设立的战略性、政策性基金&#xff0c;目前规模100亿元&#xff0c;是国内规模最大的天使投资类政府引导基金&#xff0c;致力于成为全球领先的天使母基金。 近…

youyeetoo R1卡片电脑(rk3588s)

简介&#xff1a; youyeetoo R1 是风火轮科技专为AIOT市场设计的嵌入式主板(SBC)&#xff0c;体积小但功能强大&#xff0c;搭载瑞芯微旗舰级RK3588s 八核64位处理器&#xff0c;8nm 制程&#xff0c;主频高达2.4GHz&#xff0c;集成ARM Mali-G610 MP4 GPU&#xff0c;内置6 To…

【原创】解决Kotlin无法使用@Slf4j注解的问题

前言 主要还是辟谣之前的网上的用法&#xff0c;当然也会给出最终的使用方法。这可是Kotlin&#xff0c;关Slf4j何事&#xff01;&#xff1f; 辟谣内容&#xff1a;创建注解来解决这个问题 例如&#xff1a; Target(AnnotationTarget.CLASS) Retention(AnnotationRetentio…

CSS基础入门02

目录 1.复合选择器 1.1后代选择器 1.2子选择器 1.3并集选择器 1.4伪类选择器 2.字体属性 2.1设置字体 2.2大小 2.3粗细 2.4文字样式 3.文本属性 3.1文本颜色 3.2设置文本颜色 3.3文本对齐 3.4文本装饰 3.5文本缩进 3.6行高 4.背景属性 4.1背景颜色 4.2背景图…

掌握TikTok时代:MCN的自媒体革命

随着数字时代的到来&#xff0c;媒体和内容创作的格局发生了翻天覆地的变化。社交媒体平台如今是塑造品牌形象、建立个人品牌以及传播信息的关键场所。 在这一领域&#xff0c;TikTok的崛起无疑引领了自媒体革命的浪潮。而多频道网络&#xff08;MCN&#xff09;也发挥着越来越…

IntelliJ IDEA 2023.2正式发布,新UI和Profiler转正

你好&#xff0c;我是YourBatman&#xff1a;做爱做之事❣交配交之人。 &#x1f4da;前言 北京时间2023年7月26日&#xff0c;IntelliJ IDEA 2023.2正式发布。老规矩&#xff0c;吃肉之前&#xff0c;可以先把这几碗汤干了&#xff0c;更有助于消化&#xff08;每篇都很顶哦…

ubuntu双系统安装以及启动时卡死解决办法

目录 一.简介 二.安装 如何安装Ubuntu20.04(详细图文教程-CSDN博客 Ubuntu22.04&#xff08;非虚拟机&#xff09;安装教程&#xff08;2023最新最详细&#xff09;-CSDN博客 三.ubuntu双系统启动时卡死解决办法&#xff08;在ubuntu16.04和18.04测试无误&#xff09; 问题…