java - ForkJoinPool.commonPool() 和 new ForkJoinPool(availableCPU - 1) 有什么区别?
问题描述
在我的代码中,我有一个包含静态最终变量的类
private static final ForkJoinPool pool = new ForkJoinPool(availableCPUs - 1);
我有一个长时间运行的任务提交到池中,这将占用所有 CPU 资源。提交的任何其他任务都将挂起。但是,当我切换到创建一个公共池时
private static final ForkJoinPool pool = ForkJoinPool.commonPool();
所有的任务都可以提交和执行。
我只是想知道这两段代码之间有什么区别。commonPool()
仍然调用new ForkJoinPool()
并通过availableCPUs - 1
我还注意到commonPool()
使用类型工厂SafeForkJoinWorkerThreadFactory
while new ForkJoinPool()
uses ForkJoinPool$DefaultForkJoinWorkerThreadFactory
. 这有关系吗?
非常感谢!
解决方案
我想我想通了。
ForkJoin 维护两种类型的队列:一种是通用的入站队列,另一种是每个工作线程的工作线程队列。所有工作线程将首先从一般入站队列中获取并填充它们的工作线程。在一个工作线程完成其工作队列中的所有任务后,它将尝试从其他工作线程中窃取。如果没有其他任务可以从其他工作线程中窃取,工作线程将再次从通用入站队列中获取。
但是,使用公共池,主线程也将有助于处理任务。主线程虽然没有工作队列。因此,在完成一项任务后,主线程将能够从一般入站队列中获取。
由于默认情况下,ForkJoin 队列是 LIFO,因此主线程将能够获取最后提交的任务。
推荐阅读
- c# - VaultSharp:为什么我得到“没有路由处理程序”错误?
- sql - 如何加入 2 列并提取年份并计算 postgresql
- flutter - 我在颤振项目中遇到 Hive 错误
- css - 如何在具有网格布局的空/整页上强制页脚位于页面底部
- elasticsearch - 无法搜索 Elasticsearch/Kibana 未索引的字段
- reactjs - 防止组件重新渲染
- google-cloud-platform - 如何测试 Google Cloud Storage 的备份和恢复?
- javascript - 如何在 selenium python 中使用 javascript 执行程序代码发送 ENTER/RETURN 键?
- flutter - Flutter ffmpeg:视频合并不起作用
- tensorflow - 将 CLAHE 添加到数据增强中的最简单方法是什么?