ForkJoinPool 与工作窃取

1.ForkJoin线程池的工作窃取原理是怎么回事

ForkJoinPool 是 JDK7 引入的分治并行线程池,parallelStream 底层依赖它,核心依靠 ForkJoinTask 的 fork/join 分治模型与工作窃取机制提升 CPU 利用率;池内每个 ForkJoinWorkerThread 绑定独立 WorkQueue 双端队列,自身 fork 出的任务加到队列尾部、本地从尾部取任务执行,线程无事可做时会生成随机下标环形遍历所有其他 ForkJoinWorkerThread,从对方 WorkQueue 队列头部批量偷取一半任务执行,大幅减少锁竞争;并行流依靠 Spliterator 的 trySplit 对半切分数据,递归生成 AbstractTask 拆分子任务,分片元素低于 1024 阈值就停止拆分作为叶子任务,fork 提交子任务后当前线程同步处理另一半,调用 join 等待子任务期间不会空等,会持续窃取其他任务;线程池分为 ForkJoinPool.commonPool () 全局公共池和手动 new 的自定义 ForkJoinPool,公共池所有并行流共享、不适合 IO 阻塞任务,IO 场景建议单独创建 ForkJoinPool 隔离资源,对比 ThreadPoolExecutor 共享阻塞队列的实现,私有队列 + 工作窃取的设计在纯计算密集、可拆分任务场景调度效率更高

2.ForkJoinPool 中的线程数量是固定死的吗?

ForkJoinPool 线程数有上限、不会自动扩容:默认并行流使用的 ForkJoinPool.commonPool() 线程数量 JVM 启动后永久固定;手动 new 的自定义 ForkJoinPool 只能指定最大并行度,线程不会超过该值,空闲线程可回收,但无法动态扩容突破上限,运行阶段不能修改线程数量。

  • 全局公共池 ForkJoinPool.commonPool ()(parallelStream 默认用)

    并行度(核心线程数)初始化后固定,运行中不能动态扩容 / 缩容。

    默认并行度 = CPU 核心数 - 1;

    启动前通过 JVM 参数 -Djava.util.concurrent.ForkJoinPool.common.parallelism=N 修改,JVM 启动后再改参数无效;

    没有任务时线程也不会销毁,池内工作线程常驻,数量全程不变。

  • 手动 new ForkJoinPool (parallelism) 自定义线程池

    传入的并行度是最大并发工作线程数,固定上限,不会自动扩容:

    java 复制代码
    运行
    // 最多4条工作线程,不会再多开
    ForkJoinPool pool = new ForkJoinPool(4);
3. parallelStream() 是如何利用 ForkJoinPool 进行并行处理的

parallelStream() 方法是对数据进行对半切分成2个, 加入现成的内部的升段对垒尾部. 左侧任务等待其它线程窃取, 自己则执行右侧任务. 执行的逻辑是递归进行拆分

相关推荐
Java牛马4 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌4 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
东小西5 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
mqiqe6 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
脉动数据行情6 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
月华路8 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
liangshanbo12158 小时前
虚拟列表深度面试题整理
java·开发语言·前端
gugucoding8 小时前
59. 【Java】Spring Boot 入门:第一个 Web 应用
java·开发语言·spring boot
10mAh9 小时前
【Java】HashMap 的 put 到底做了什么?——冲突、扩容与树化实测
java·开发语言·hash
我命由我1234510 小时前
人脸识别 - 勒克斯(光线照射到物体表面上的明亮程度)
android·java·学习·java-ee·人脸识别·学习方法·android runtime