Executors.newWorkStealingPool()适合执行时间短、数量多、无依赖、可分治、不阻塞的轻量级异步任务,基于ForkJoinPool实现工作窃取,线程数默认等于CPU核心数。
Executors.newWorkStealingPool()
会自动创建一个基于
的并行线程池,其并行度默认等于当前机器的可用 CPU 核心数(
),专为大量轻量级、可拆分的异步任务设计,无需手动指定线程数。
它适合什么样的任务
该线程池最适合满足以下特征的任务:
执行时间短(毫秒级),且数量多(如处理数千个小型计算、数据转换、IO 就绪后的轻量回调)
任务之间无强依赖,能独立完成,最好支持“分而治之”(例如递归分解数组、树遍历、流式并行处理)
不阻塞线程(避免调用
、同步 IO、锁等待等)——否则会拖慢整个工作窃取队列
使用
、
或
等天然适配 ForkJoin 框架的 API
基本用法与关键细节
直接调用即可获得开箱即用的自适应池:
注意:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
返回的
实际是
实例,但被包装为接口,不可强转操作内部参数(如需定制,请直接 new ForkJoinPool)
不能调用
强制中断正在运行的窃取任务(ForkJoinPool 不响应中断信号),应优先用
未显式指定并行度时,它始终按
启动;若需调整(如预留核给其他服务),可传入整数:
和普通线程池的关键区别
不同于
或
:
每个线程维护自己的双端队列(Deque),新任务压入队尾,窃取时从队首取——减少竞争
空闲线程会主动“窃取”其他线程队列尾部的任务(降低负载不均),提升 CPU 利用率
没有核心/最大线程概念,线程数 ≈ 并行度,不会动态扩容缩容(非为长任务或高延迟场景设计)
任务调度开销更低,但要求任务粒度细、无阻塞——否则窃取机制反而增加上下文切换负担
一个实用小建议
对批量轻量计算,优先用
,它底层默认就用
;如需隔离资源或自定义并行度,才显式创建
并传给
或
:
ForkJoinPoolRuntime.getRuntime().availableProcessors()Thread.sleep()CompletableFutureForkJoinTaskStream.parallel()ExecutorService pool = Executors.newWorkStealingPool();
// 提交 Runnable 或 Callable
pool.submit(() -> System.out.println("Hello from " + Thread.currentThread().getName()));
// 或配合 CompletableFuture 使用(更推荐)
CompletableFuture.supplyAsync(() -> computeHeavyButSplittable(), pool);
ExecutorServiceForkJoinPoolshutdownNow()shutdown() + awaitTermination()availableProcessors()newWorkStealingPool(4)FixedThreadPoolCachedThreadPoolparallelStream()ForkJoinPool.commonPool()newWorkStealingPool()supplyAsyncrunAsyncExecutorService customPool = Executors.newWorkStealingPool(6);
List results = dataList.parallelStream()
.map(item -> heavyTransform(item)) // 注意:这里仍走 commonPool
.collect(Collectors.toList());
// 正确方式:用 supplyAsync 显式指定池
List> futures = dataList.stream()
.map(item -> CompletableFuture.supplyAsync(() -> heavyTransform(item), customPool))
.collect(Collectors.toList());
