[实践总结] 通过累加求和来学习 分支/合并框架

分支/合并框架

分支/合并框架的目的是以 递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果。

它是ExecutorService接口的一个实现,它把子任务分配给线程池(称为ForkJoinPool)中的工作线程。

ForkJoinSumCalculator

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;//继承RecursiveTask来创建可以用于分支/合并框架的任务
public class ForkJoinSumCalculator extends RecursiveTask<Long> {// ---------------------------框架的属性---------------------------public static final ForkJoinPool FORK_JOIN_POOL = new ForkJoinPool();// ---------------------------业务的属性---------------------------public static final long THRESHOLD = 10_000;  //不再将任务分解为子任务的数组大小private final long[] numbers;private final int start;private final int end;//公共构造函数 用于 创建主任务public ForkJoinSumCalculator(long[] numbers) {this(numbers, 0, numbers.length);}//私有构造函数 用于 以递归方式为主任务创建子任务private ForkJoinSumCalculator(long[] numbers, int start, int end) {this.numbers = numbers;this.start = start;this.end = end;}// 调用主任务入口public static long forkJoinSum(long n) {long[] numbers = LongStream.rangeClosed(1, n).toArray();ForkJoinTask<Long> task = new ForkJoinSumCalculator(numbers);return FORK_JOIN_POOL.invoke(task);}// 感觉像主管给不同人派活,然后收集结果@Overrideprotected Long compute() {int length = end - start;if (length <= THRESHOLD) {//如果大小小于或等于阈值,顺序计算结果return computeSequentially();}ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length / 2); //为数组的前一半求和leftTask.fork(); // 另起一个ForkJoinPool线程 异步执行 新创建的子任务ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length / 2, end); //为数组的后一半求和Long rightResult = rightTask.compute(); // 当前线程继续执行后半部分任务Long leftResult = leftTask.join(); // 等leftTask执行完毕return leftResult + rightResult; // 收集2个子任务结果组合}// 最底层的串行计算private long computeSequentially() {long sum = 0;for (int i = start; i < end; i++) {sum += numbers[i];}return sum;}
}

使用

ForkJoinSumCalculator.forkJoinSum(10_000_000L)# 结果
50000005000000

-----------------------------------------------------------------------------读书笔记摘自 书名:Java 8实战 作者:[英] Raoul-Gabriel Urma [意] Mario Fusco [英] Alan M

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

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

相关文章

关于 android 热更新技术

Android应用实现热更新&#xff08;也称为动态更新或增量更新&#xff09;是指在不通过Google Play或其他应用市场重新发布完整APK包的情况下&#xff0c;应用能够从远程服务器下载并安装部分代码或资源文件以修复bug或增加新功能。这一机制提高了用户体验和产品迭代速度。以下…

循环业务异常外部处理导致的问题

问题描述&#xff1a; 在业务执行循环中&#xff0c;异常捕捉处理在循环外。当循环中的某个业务执行异常时&#xff0c;会影响后续业务的执行&#xff0c;因为没有采取相应措施来处理该异常并继续循环执行。 以下是示例代码&#xff0c;演示了在循环中执行多个业务操作并在异…

头歌:旅游网站大数据分析 - 数据抓取

package step1; import java.io.File; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document;public class Task {/*** param filePath 文件路径&#xff1a;backups/www.ctrip.com.txt/* return* throws IOException*/public Document getHt…

小白入门java基础-反射详解

一&#xff1a;介绍 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序&#xff0c;在一次编译后&#xff0c;可以在多个系统平台上运行。 主…

ajax请求的详细流程+详细示例

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建异步 Web 应用程序的技术。下面是 AJAX 请求的详细流程&#xff1a; 创建 XMLHttpRequest 对象&#xff1a;在 JavaScript 代码中&#xff0c;使用 new XMLHttpRequest() 创建一个 XMLHttpRequest 对…

Linux常用命令总结

1.系统查看 2.网络相关 2.1 设置静态网络 [rootlocalhost Desktop]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:B1:24:A1通过ifconfig以上信息主要得到 eth0 还是eth1;还有HWaddr,1) 需要Vmware中的"使用本次DHCP"服务将IP地址分配给虚拟机关闭 2)…

Spring Boot笔记1

1. SpringBoot简介 1.1. 原有Spring优缺点分析 1.1.1. Spring的优点分析 Spring是Java企业版&#xff08;Java Enterprise Edition&#xff0c;javeEE&#xff09;的轻量级代替品。无需开发重量级的Enterprise JavaBean&#xff08;EJB&#xff09;&#xff0c;Spring为企业…

Bmp2Png是什么工具?好用吗?

Bmp2Png是什么工具&#xff1f;好用吗&#xff1f; 批量BMP图片转为PNG透明图片&#xff0c;去掉BMP黑色背景&#xff0c;压缩导出png图片V1.1前段时间上传了一款bmp转png并去黑底的demo软件&#xff0c;非常受欢迎&#xff0c; 上一版本地址&#xff1a;批量BMP图片转为PNG…

计算机网络 (期末救命版)

文章目录 Ⅰ 网络概述1. 互联网概述与组成2. 计算机网络的类别3. 计算机网络的性能指标4. 计算机网络体系结构 Ⅱ 物理层1. 物理层的任务2. 信道复用技术 Ⅲ 数据链路层1. 点对点信道2. 基本问题3. 点对点协议 PPP4. 使用广播信道的数据链路层 Ⅳ 网络层1. 网络层的服务2. 网际…

解算人生--写于2023跨年之夜

最近买了一本书&#xff0c;书名叫《计算》 读了部分内容&#xff0c;虽然理解上还需要再下下功夫&#xff0c;但是直观的感觉冲击还是挺大的&#xff0c;最明显的就是表面与本质的把握。大家可能都有这样一种感觉&#xff0c;初步涉足某一领域时&#xff0c;开始我们都会被大量…

Pytorch深度学习-----完整的模型验证套路

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop) Pytorch深度学习-----…

github使用技巧(经验篇)

相关经验 指定代码范围并高亮显示 例如&#xff0c;指定nn_ops.py文件2612-L2686行的代码&#xff1a;https://github.com/tensorflow/tensorflow/blob/v2.14.0/tensorflow/python/ops/nn_ops.py#L2612-L2686 FAQ Q&#xff1a;github网页打不开&#xff1f; 【github加载不…

WeNet语音识别调用通义千问

WeNet语音识别调用通义千问 WeNet语音识别对通义千问&#xff08;Qwen-72B-Chat Bot&#xff09;调用&#xff0c;首先通过WeNet将用户的语音输入转录为文本&#xff0c;然后将此文本输入通用问答模型以获取答案。 本人原创作品&#xff0c;体验一下 连续对话 WeNet语音识别…

如何获取2024年交易日历?

交易日历是金融领域的重要参考工具&#xff0c;包含了各国的法定节假日、休市日、交易时间调整等信息&#xff0c;能够帮助投资交易者合理安排交易时间、了解市场情况、提高决策的准确性。 DolphinDB 自 2.00.9/1.30.21 版本开始&#xff0c;内置了国内外五十多个交易所的交易…

一起玩儿物联网人工智能小车(ESP32)——22. 用ESP32的LED PWM控制器给TT马达调速(C MicroPython)

新年快乐&#xff01; 2024&#xff0c;我们一起玩儿&#xff01; 摘要&#xff1a;本文主要介绍如何使用Mixly实现PWM波形的输出。 下面就先用Mixly实现PWM波形的输出。首先打开Mixly软件&#xff0c;这次还是先使用C语言来实现。如果你有示波器&#xff0c;或者逻辑分析仪&a…

Linux: memory: THP相关的一些链接

https://docs.kernel.org/mm/page_tables.html https://access.redhat.com/solutions/46111 https://lwn.net/Articles/423584/ 引入的历史 http://www.linux-kvm.org/images/9/9e/2010-forum-thp.pdf ; develper的展示 https://developers.redhat.com/blog/2021/04/27/benchma…

基于SSM的牙科诊所管理系统

基于SSM的牙科诊所管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台主页 后台界面 摘要 随着社会的不断发展和人们生活水平的提高&#xff0c;牙…

C++面试宝典第13题:计算餐厅账单

题目 假如你是一家餐厅的收银员,需要编写一个程序来计算顾客的账单。程序应该能够接受顾客点的菜品和数量,并根据菜品的单价计算出总价。另外,程序还应该能够处理折扣和优惠券,并输出最终的账单金额。 解析 这道题主要考察应聘者使用面向对象的设计方法来解决实际问题的能力…

【网络面试(3)】浏览器委托协议栈完成消息的收发

前面的博客中&#xff0c;提到过很多次&#xff0c;浏览器作为应用程序&#xff0c;本身是不具备向网络中发送网络请求的能力&#xff0c;要委托操作系统的内核协议栈来完成。协议栈再调用网卡驱动&#xff0c;通过网卡将请求消息发送出去&#xff0c;本篇博客就来探讨一下这个…

UG NX二次开发(C#)-Ufun和NXOpen混合编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、Ufun函数3、 NXOpen4、混合编程实现1、前言 在UG NX二次开发过程中,采用Ufun功能比较简单,能用比较少的代码实现我们需要的功能,但是ufun函数的功能不是很强大,尤其随着UG NX的版本…