当前位置: 首页 > news >正文

CompletableFuture的底层ForkJoinPool

什么是 ForkJoinPool?它和普通线程池(ThreadPoolExecutor)有什么区别?

答案要点

ForkJoinPool 是 Java 7 引入的线程池,专为 分治任务 设计,支持递归任务拆分(Fork)和结果合并(Join)。

核心区别:

工作窃取算法(Work-Stealing):空闲线程从其他线程的任务队列尾部窃取任务,提高 CPU 利用率

任务拆分与合并:天然支持递归任务的并行化,而普通线程池需要手动拆分任务

适用场景:ForkJoinPool 适合 CPU 密集型任务(如并行计算),普通线程池适合通用异步任务


ForkJoinPool 的“工作窃取算法”是如何工作的?为什么它能提高效率?

答案要点

每个线程维护一个双端队列(Deque),存放自己的任务

当线程的任务队列为空时,会从其他线程的队列 尾部 窃取任务

高效原因

减少线程空闲时间,最大化 CPU 利用率。

任务拆分和窃取是动态的,适合处理不均衡的任务负载


为什么 CompletableFuture 默认使用 ForkJoinPool?有什么优缺点?

答案要点

优点

工作窃取算法适合处理大量短小的异步任务

公共线程池复用,避免频繁创建/销毁线程的开销

缺点

公共线程池是全局共享的,如果任务阻塞(如 I/O),可能影响其他依赖公共池的任务

默认并行级别可能不适合所有场景(需根据 CPU 核心数调整)

改进方案:为 CompletableFuture 指定自定义线程池:

ExecutorService customPool = Executors.newFixedThreadPool(10);
CompletableFuture.runAsync(() -> {...}, customPool);


如果 ForkJoinPool 的公共线程池被阻塞,会对系统产生什么影响?如何避免?

答案要点

影响

所有依赖公共线程池的功能(如并行流、CompletableFuture)性能下降

可能导致任务排队积压,甚至线程饥饿

避免方法

禁止在公共线程池中执行阻塞操作(如同步 I/O)

为阻塞任务分配独立的线程池


核心设计

1. ForkJoinPool的任务会被内部存储了一个WorkQueue数组,提交给ForkJoinPool的任务会被分配到指定的WorkQueue上执行

2. 每个WorkQueue内部维护了一个ForkJoinTask数组用来存储待执行的任务,以及一个独立的ForkJoinWorkerThread用来真正执行任务


ForkJoinPool的执行过程

提交任务

以submit方法为例,我们看下ForkJoinPool是如何处理提交的任务的,真正处理的方法是externalPush,如下所示,

1. 判断工作队列数组是否为空

2. 通过按位与得到当前任务分配的工作队列

3. 尝试通过CAS锁定该队列

4. 判断工作队列中的任务数组是否为空

5. 释放锁

执行任务

ForkJoinPool执行任务的过程如下

runWork()

1. 判断工作队列是否需要扩容

2. 阻塞调用对应WorkQueue的runTask方法

3. 如果无法获取到执行资源,就等待任务调用

WorkQueue的rukTask()

1. 标记当前状态为忙碌

2. 调用当前任务执行

3. 继续执行当前队列中等待执行的任务

4. 尝试从其他WorkQueue中窃取任务执行

总结

ForkJoinPool通过内部维护WorkQueue数组的方式,将ForkJoinTask任务分配到指定的工作队列中执行,通过将鸡蛋分散在多个篮子这种分治思想提升线程的工作效率,并且针对线程执行过程中出现的空闲情况,设计出了工作窃取的算法,促使工作线程尽可能的饱和执行,在线程安全方面,通过Unsafe的CAS操作配合原子类,保证了多线程场景下的竞争安全问题


既然forkjoinpool这么高效,那为什么我们实际使用场景中还是要指定自定义线程池

1.公共线程池阻塞问题

默认的ForkJoinPool.commonPool()是全局共享的,如果任务中包含阻塞操作(如I/O、同步锁、数据库查询等),可能导致公共线程池中的线程被长时间占用。这会降低系统的吞吐量,甚至引发线程饥饿(所有线程被阻塞,后续任务无法执行)

若所有类似任务都使用默认线程池,大量阻塞操作会迅速耗尽公共线程池的线程


2.任务选型

CPU密集型任务和IO密集型任务

IO密集型任务不适合ForkJoinPool使用,因为它会长时间占用线程

ForkJoinPool在任务分治和CPU密集型场景中表现出色


3.控制线程池参数

ForkJoinPool.commonPool()的默认配置可能不适用于所有场景

相关文章:

CompletableFuture的底层ForkJoinPool

什么是 ForkJoinPool?它和普通线程池(ThreadPoolExecutor)有什么区别? 答案要点: ForkJoinPool 是 Java 7 引入的线程池,专为 分治任务 设计,支持递归任务拆分(Fork)和…...

高等数学第五章---定积分(§5.1定积分的概念、性质和应用)

5.1 定积分的概念及性质 一、引例 在学习定积分之前,我们先通过两个具体的例子来感受其思想和方法。 例1 曲边梯形的面积 定义:曲边梯形 由连续曲线 y f ( x ) y f(x) yf(x)(假设 f ( x ) ≥ 0 f(x) \ge 0 f(x)≥0 在所讨论的区间上&…...

Java基础学完,继续深耕(0506)SQL--多表关系

多表关系 一对多(多对一) 一对一 多对多 一对多 场景:部门与员工的关系 (一个部门下有多个员工)。 实现:在数据库表中多的一方,添加字段,来关联一的一方的主键。 现在只是在语法上关联了,…...

python打卡day17

聚类的基础知识 知识点 聚类的指标聚类常见算法:kmeans聚类、dbscan聚类、层次聚类三种算法对应的流程 实际在论文中聚类的策略不一定是针对所有特征,可以针对其中几个可以解释的特征进行聚类,得到聚类后的类别,这样后续进行解释也…...

洛谷---P1629 邮递员送信

题目描述 有一个邮递员要送东西,邮局在节点 1。他总共要送 n−1 样东西,其目的地分别是节点 2 到节点 n。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 m 条道路。这个邮递员每次只能带一样东西,并且运…...

第11次:用户注册(简要版)

1、定义模板 在templates文件夹下边新建register.html&#xff0c;代码如下&#xff1a; <html lang"en"> <head><meta charset"UTF-8"><title>注册</title> </head> <body><!--{%是模板标签&#xff0c; …...

【IP101】图像特征提取技术:从传统方法到深度学习的完整指南

&#x1f31f; 特征提取魔法指南 &#x1f3a8; 在图像处理的世界里&#xff0c;特征提取就像是寻找图像的"指纹"&#xff0c;让我们能够识别和理解图像的独特性。让我们一起来探索这些神奇的特征提取术吧&#xff01; &#x1f4da; 目录 基础概念 - 特征的"体…...

对windows的简单介绍

目录 一、Windows 操作系统概述 1. 定义与定位 2. 核心目标 二、历史与版本演变 1. 早期阶段&#xff08;1985–1995&#xff09; 2. NT 内核时代&#xff08;1996–2009&#xff09; 3. 现代操作系统&#xff08;2012–至今&#xff09; 三、系统架构与技术特性 1. 内…...

Waymo公司正在加快其位于亚利桑那州新工厂的无人驾驶出租车(robotaxi)生产进度

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

JavaSE核心知识点01基础语法01-03(流程控制:顺序、分支、循环)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点01基础语法01-03&#xff0…...

信息论01:从通信到理论的飞跃

信息论01&#xff1a;从通信到理论的飞跃 1. 信息论的诞生与发展 1.1 前信息论时代&#xff08;1920s之前&#xff09; 信息与消息的混淆&#xff1a;传统认知中将信息等同于消息本身先驱者奠基&#xff1a; 哈里奈奎斯特 (1924)&#xff1a;提出《影响电报速度的某些因素》…...

Pandas 的透视与逆透视

目录 1. 透视 1.1 pivot 1.2 pivot_table 2.逆透视 1. 透视 透视是长表变宽表。 pivot() 和 pivot_table()两个函数都可以做到&#xff0c;后者可以聚合前者不行。 特性df.pivot()df.pivot_table()重复值处理要求索引和列的组合唯一&#xff0c;否则报错 ValueError允许…...

AI大模型驱动的智能座舱研发体系重构

随着AI大模型&#xff08;如LLM、多模态模型&#xff09;的快速发展&#xff0c;传统智能座舱研发流程面临巨大挑战。传统座舱研发以需求驱动、功能固定、架构封闭为特点&#xff0c;而AI大模型的引入使得座舱系统向自主决策、动态适应、持续进化的方向发展。 因此思考并提出一…...

【东枫科技】代理英伟达产品:DPU

NVIDIA BlueField-3 DPU 400Gb/s 基础设施计算平台 NVIDIA BlueField -3 数据处理单元 (DPU) 是第三代基础设施计算平台&#xff0c;使企业能够构建从云端到核心数据中心再到边缘的软件定义、硬件加速的 IT 基础设施。借助 400Gb/s 以太网或 NDR 400Gb/s InfiniBand 网络连接…...

【KWDB 创作者计划】一文掌握KWDB的时序表管理

前言 本文是在对时序数据库有一定了解&#xff0c;并且KWDB的数据库操作了解后进行学习的文章安排&#xff0c;如果对时序数据库与KWDB的数据库操作还不怎么了解的可以查阅官网的文档进行提前学习&#xff0c;当有了这些基础后&#xff0c;本文就是对时序数据表的一个管理操作…...

《算法导论(第4版)》阅读笔记:p9-p9

《算法导论(第4版)》学习第 6 天&#xff0c;p9-p9 总结&#xff0c;总计 1 页。 一、技术总结 1. data structure A data structure is a way to store and organize data in order to facilitate access and modifications(数据结构是一种存储和组织数据的方式&#xff0c…...

Facebook隐私保护措施的优缺点解析

在这个数字化的时代&#xff0c;隐私保护已成为公众关注的热点话题。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;其隐私保护措施自然也受到了广泛的关注和讨论。本文将对Facebook的隐私保护措施进行解析&#xff0c;探讨其优点与缺点&#xff0c;并探讨如…...

深入了解linux系统—— 进程地址空间

前言 程序地址空间 在之前&#xff0c;我们学习C/C时&#xff0c;多多少少都看过这样的一张图 我们现在通过下面这一段代码看一下&#xff1a; #include <stdio.h> #include <unistd.h> #include <stdlib.h> int g_unval; int g_val 100; int main(int…...

电动加长杆金属硬密封法兰式蝶阀泄漏等级解析:水、蒸汽、油品介质的可靠选择-耀圣

电动加长杆金属硬密封法兰式蝶阀泄漏等级解析&#xff1a;水、蒸汽、油品介质的可靠选择 在工业流体控制领域&#xff0c;电动金属硬密封蝶阀凭借其卓越的密封性能和耐高温高压特性&#xff0c;成为水、蒸汽、油品等介质的核心控制设备。其泄漏等级作为衡量阀门性能的关键指标…...

win11共享打印机主机设置

1.首先打开设置&#xff0c;选择打印机和扫描仪点击打印机属性&#xff0c;将共享窗口的共享这台打印机和在客户端计算机上呈现打印作业这两项勾选上。 2.通过cmd命令 gpedit.msc 打开本地组策略编辑器。 3.网络访问选择仅来宾 4.将账户来宾状态选择启用 5.将拒绝从网络访问这台…...

Flowable7.x学习笔记(二十)查看流程办理进度图

前言 本文是基于继承Flowable的【DefaultProcessDiagramCanvas】和【DefaultProcessDiagramGenerator】实现的自定义流程图生成器&#xff0c;通过自定义流程图生成器可以灵活的指定已经执行过的节点和当前正在活跃的节点样式&#xff0c;比如说已经执行完成的节点我们标绿&…...

【计算机网络 第8版】谢希仁编著 第四章网络层 地址类题型总结

小结 个人觉得地址类在网络层算好做的题&#xff0c;这部分知识本身并不多&#xff0c;理解到位了就是2进制和10进制的换算题了。而且这种题给你一小时例题和标答&#xff0c;肯定自己都能悟出来。但是计网网络层的整体我感觉很散&#xff0c;老师讲的也乱七八糟的&#xff0c…...

一种基于条件生成对抗网络(cGAN)的CT重建算法

简介 简介:该文提出了一种基于条件生成对抗网络(cGAN)的CT重建算法,通过引入CBAM注意力机制增强网络对关键特征的提取能力,有效解决了CT成像中因噪声干扰导致的重建精度下降问题。实验采用固体火箭发动机模拟件数据集,将正弦图分为五组并添加不同程度的噪声进行训练。结…...

欧拉系统(openEuler)上部署OpenStack的完整指南 ——基于Yoga版本的全流程实践

&#xff08;资源区里有上传的配置好的openstack镜像&#xff09; 一、环境规划与前置准备 1. 硬件与节点规划升级 存储节点&#xff08;可选&#xff09;&#xff1a;若需Cinder后端&#xff0c;建议配置SSDHDD混合存储网络拓扑强化&#xff1a; 管理网络&#xff1a;启用V…...

oceanbase不兼容SqlSugarCore的问题

问题发现 C#程序使用SqlSugarCore5.1.4.166进行数据库操作&#xff0c;而且项目需要在多台服务器上面部署&#xff0c;结果发现A服务器部署运行没有问题&#xff0c; B服务器部署却报错&#xff1a;SqlSugar.SqlSugarException:Connect timeout expired. 但是我们的C#代码是一…...

深入理解分布式锁——以Redis为例

一、分布式锁简介 1、什么是分布式锁 分布式锁是一种在分布式系统环境下&#xff0c;通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据&#xff0c;从而避免数据的不一致性。 线程锁&#xff1a; 也被称为互斥锁&#xff08…...

OrangePi Zero 3学习笔记(Android篇)1 - 搭建环境

目录 1. 下载安装Ubuntu22.04 1.1 安装增强功能 1.2 设置共享文件夹 1.3 创建AOSP.vdi 1.4 更新相关软件包 2. 解压AOSP源代码 3. 编译代码 3.1 编译uboot/Linux 3.2 编译AOSP源代码 3.3 内存问题调试记录 3.3.1 查看具体什么问题 3.3.2 关闭dex2oat&#xff08;无…...

RabbitMq(尚硅谷)

RabbitMq 1.RabbitMq异步调用 2.work模型 3.Fanout交换机&#xff08;广播模式&#xff09; 4.Diret交换机&#xff08;直连&#xff09; 5.Topic交换机&#xff08;主题交换机&#xff0c;通过路由匹配&#xff09; 6.Headers交换机&#xff08;头交换机&#xff09; 6…...

OpenAI的“四面楚歌”:从营利到非营利,一场关于AGI控制权的革命

引言 当“奥特曼妥协”与“四面楚歌”并置时&#xff0c;OpenAI的这次重大调整&#xff0c;仿佛在科技史上投下一颗震撼弹。这家曾因“拒绝盈利”而备受争议的人工智能公司&#xff0c;如今却在资本与理想之间艰难抉择——放弃营利性转型&#xff0c;回归非营利初心。这不仅是对…...

[250505] Arch Linux 正式登陆 Linux 的 Windows 子系统

目录 Arch Linux 正式登陆 Windows Subsystem for Linux (WSL) Arch Linux 正式登陆 Windows Subsystem for Linux (WSL) Arch Linux 社区与 Microsoft 合作&#xff0c;正式宣布 Arch Linux 现已提供官方的 Windows Subsystem for Linux (WSL) 镜像。这意味着 Windows 用户现…...

MySQL 日期格式化:DATE_FORMAT 函数用法

MySQL 日期格式化&#xff1a;DATE_FORMAT 函数用法 在 MySQL 中&#xff0c;DATE_FORMAT() 函数用于将日期或时间值格式化为指定的字符串格式。 正确语法 DATE_FORMAT(date, format)常用格式说明符 说明符描述%Y四位数的年份&#xff08;例如&#xff1a;2023&#xff09;…...

java springboot解析出一个图片的多个二维码

引入 <dependencies><!-- ZXing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing…...

【四川省专升本计算机基础】第一章 计算机基础知识(上)

前言 对计算机专业的同学来说这门课程可能很简单&#xff0c;容易拿高分&#xff08;125分以上&#xff09;&#xff0c;但也可能很容易大意丢分。因为本门课程人称&#xff1a;背多分。大意丢分者的心态觉得计算机基础都学过&#xff0c;内容很简单&#xff0c;最后才开始背计…...

406错误,WARN 33820 --- [generator] [nio-8080-exec-4] .w.s.m.s.DefaultHa

在接口调用过程中&#xff0c;后端出现.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]错误。检查了一个小时才发现我返回的对象没有写getter方法&#xff0c; 当Spring B…...

基于STM32、HAL库的SST26VF064B NOR FLASH存储器驱动应用程序设计

一、简介: SST26VF064B是Microchip公司生产的一款64Mbit(8MB)串行闪存器件,采用SPI接口通信,具有以下特点: 工作电压:2.7-3.6V 最高104MHz时钟频率 统一4KB扇区结构 快速擦除和编程时间 低功耗特性 支持标准SPI、Dual SPI和Quad SPI模式 二、硬件接口: STM32L4引脚SST26V…...

美信监控易:全栈式自主可控的底层架构优势

在当今数字化时代&#xff0c;企业的运维管理面临着越来越多的挑战。为了确保业务的稳定运行&#xff0c;企业需要一款高效、可靠的运维管理软件。北京美信时代的美信监控易运维管理软件&#xff0c;以其全栈式自主可控的底层架构优势&#xff0c;成为了运维团队的理想选择。 …...

Class AB OPA corner 仿真,有些corenr相位从0开始

Class AB OPA做 STB 仿真时&#xff0c;会遇到有些corner(c0_0、c0_4、c0_5)相位从0开始的情况。 首先应该去检查电路&#xff0c;电路里是否有正反馈&#xff1b;排除没有正反馈后&#xff0c;考虑是图中的红框中的线性跨导环中的Vds 太大导致了碰撞电离导致的。 查找了网上…...

【JEECG】BasicTable单元格编辑,插槽添加下拉组件样式错位

1.功能说明 BasicTable表格利用插槽&#xff0c;添加组件实现单元格编辑功能&#xff0c;选择组件下拉框错位 2.效果展示 3.解决方案 插槽内组件增加&#xff1a;:getPopupContainer"getPopupContainer" <template #salesOrderProductStatus"{ column, re…...

第十五届蓝桥杯单片机国赛-串口解析

串口通信像是蓝桥杯单片机组国赛中一个若隐若现的秘境&#xff0c;总在不经意间为勇者们敞开大门。然而&#xff0c;初次探索这片领域的冒险者&#xff0c;常常会被其神秘莫测的特性所震慑&#xff0c;黯然退场&#xff08;编不下去了&#xff0c;直接进入正题&#xff09;。 附…...

Flutter开发HarmonyOS实战-鸿蒙App商业项目

Flutter开发HarmonyOS实战内容介绍&#xff1a; Flutter开发HarmonyOS 鸿蒙App商业项目&#xff08;小米商城APP&#xff09;实战视频教程 Flutter开发鸿蒙APP是在《FlutterGetx仿小米商城》项目基础之上讲解的&#xff0c;调试Flutter HarmonyOS应用需要有HarmonyOS Next的手机…...

【回眸】香橙派Zero2 超声波模块测距控制SG90舵机转动

前言 知识准备 超声波模块时序图 gettimeofday()函数作用 gettimeofday()函数原型 tv结构体 获取当前系统时间与格林威治时间的时间差 获取香橙派数10万秒花费的时间 使用超声波模块获取到障碍物距离 SG90舵机模块 舵机模块的作用 舵机模块方波时序图 舵机模块工作原…...

RabbitMQ 添加新用户和配置权限

以下是关于使用 sudo rabbitmqctl add_user 命令创建新用户的详细示例&#xff0c;同时包含创建用户后进行权限设置、角色设置等相关操作的示例。 1. 前提条件 确保你的 RabbitMQ 服务已经正常运行&#xff0c;并且你具有执行 sudo 命令的权限。 2. 创建新用户 假设我们要创…...

【前缀和】矩阵区域和

文章目录 1314. 矩阵区域和解题思路1314. 矩阵区域和 1314. 矩阵区域和 ​ 给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和: i - k <= r <= i + k, j - k <= c <= j + k …...

编程日志4.25

栈的stl模板 可直接用<stack>库进行调用 #include<iostream> #include<stack>//栈的模板库 using namespace std; int main() { stack<int> intStk;//整数 栈 stack<double> doubleStk;//浮点数 栈 intStk.push(1); intStk.pu…...

【中间件】brpc之工作窃取队列

文章目录 BRPC Work Stealing Queue1 核心功能2 关键数据结构2.1 队列结构2.2 内存布局优化 3 核心操作3.1 本地线程操作&#xff08;非线程安全&#xff09;3.2 窃取操作&#xff08;线程安全&#xff09; 4 设计亮点4.1 无锁原子操作4.2 环形缓冲区优化4.3 线程角色分离 5 性…...

用OMS从MySQL迁移到OceanBase,字符集utf8与utf8mb4的差异

一、问题背景 在一次从MySQL数据库迁移到OceanBase的MySQL租户过程中&#xff0c;出现了一个转换提示&#xff1a; [WARN][CONVER] he table charset:utf8->utf8mb4&#xff0c; 你可能会担心这种转换可能导致字符集不兼容的问题。但通过查阅相关资料可知&#xff0c;utf8m…...

知乎前端面试题及参考答案

Webpack 和 Vite 的区别是什么? 构建原理: Webpack 是基于传统的打包方式,它会将所有的模块依赖进行分析,然后打包成一个或多个 bundle。在开发过程中,当代码发生变化时,需要重新构建整个项目,构建速度会随着项目规模的增大而变慢。Vite 利用了浏览器对 ES 模块的支持,…...

项目中为什么选择RabbitMQ

当被问及为什么选择某种技术时&#xff0c;应该结合开发中的实际情况以及类似的技术进行分析&#xff0c;适合的技术才是最好的。 在项目中为什么选择RabbitMQ 作为消息中间件&#xff0c;主要可以基于以下几方面进行分析&#xff1a; 1. 可靠性 消息持久化&#xff1a;Rabbi…...

深入解析二维矩阵搜索:LeetCode 74与240题的两种高效解法对比

文章目录 [toc]**引言** **一、问题背景与排序规则对比****1. LeetCode 74. 搜索二维矩阵****2. LeetCode 240. 搜索二维矩阵 II** **二、核心解法对比****方法1&#xff1a;二分查找法&#xff08;适用于LeetCode 74&#xff09;****方法2&#xff1a;线性缩小搜索范围法&…...

Qt案例 以单线程或者单生产者多消费者设计模式实现QFTP模块上传文件夹功能

前文:Qt案例 使用QFtpServerLib开源库实现Qt软件搭建FTP服务器,使用QFTP模块访问FTP服务器 已经介绍了Qt环境下搭建FTP服务器或者使用QFTP上传的方式示例, 这里主要介绍下使用QFTP模块上传整个文件夹的案例示例。 目录导读 前因后果单线程处理1.定义FTPFolderUpload 继承 QT…...