ForkJoinPool.commonPool() 线程池大小
时间: 2023-12-19 15:40:26 浏览: 384
ForkJoinPool.commonPool() 是 Java 中的一个默认线程池实例,它是基于Fork-Join框架实现的。它的大小是根据当前系统的CPU核心数来动态调整的。
在 Java 8 中,默认情况下,ForkJoinPool.commonPool() 的大小是根据 Runtime.getRuntime().availableProcessors() 方法返回的 CPU 核心数来决定的。它的最大线程数默认为 CPU 核心数减一。
但是需要注意的是,如果你调整了 ForkJoinPool.common.parallelism 系统属性,那么它的大小就不再是默认值,而是根据你设置的值来决定。你可以通过 System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "N") 来设置线程池的大小为 N。
总结来说,ForkJoinPool.commonPool() 的线程池大小取决于系统的 CPU 核心数,并且可以通过系统属性进行调整。
相关问题
ForkJoinPool.commonPool()线程池的配置
ForkJoinPool.commonPool()线程池是Java 8中新增的线程池,它是一个公共的线程池,可以被整个应用程序共享。它的配置是由JVM自动完成的,通常会根据CPU的核心数来确定线程池的大小。如果需要更精细的配置,可以使用ForkJoinPool类的构造函数来创建自定义的线程池。
forkjoinpool 源码
### ForkJoinPool 源码实现
#### 构造函数与初始化过程
`ForkJoinPool` 的构造函数负责创建一个新的工作窃取线程池。此过程中会设置核心参数,如并行级别和平级队列的数量。
```java
public ForkJoinPool(int parallelism,
ForkJoinWorkerThreadFactory factory,
UncaughtExceptionHandler handler,
boolean asyncMode) {
this(parallelism, factory, handler, asyncMode,
"ForkJoinPool-" + nextPoolId() + "-worker-");
}
```
上述代码展示了 `ForkJoinPool` 基本构造器的一部分逻辑[^1]。通过传递给定的工厂方法来实例化新的工作者线程,并允许自定义异常处理器以及异步模式标志位。
#### 工作窃取算法支持
为了提高多核 CPU 上的工作效率,`ForkJoinPool` 使用了一种称为“工作窃取”的调度策略。这种技术使得当某个线程完成自己的任务后能够从其他忙碌线程那里获取未完成的任务继续执行。
每个 `ForkJoinWorkerThread` 都维护着两个双端队列 (Deque),分别用于存储本地提交的任务和可能被其他线程偷走的任务。这种方式不仅减少了锁竞争还提高了缓存命中率[^2]。
#### 提交任务到线程池
对于外部调用者来说,可以通过 submit 方法向 `ForkJoinPool` 提交可运行对象或返回结果的任务:
```java
<T> Future<T> submit(Callable<T> task);
Future<?> submit(Runnable task);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks);
// 更多功能...
```
内部则会将这些请求封装成相应的 `ForkJoinTask` 子类实例再加入到适当位置等待被执行[^4]。
#### 默认配置下的 Parallel Stream 支持
值得注意的是,在 Java 8 及之后版本中引入了流式 API(Stream API),其中包含了对并行操作的支持。默认情况下,所有的并行流都共享同一个全局性的 `ForkJoinPool` 实例——即 common pool,它的大小通常是可用处理器数量减去一[^3]。
```java
static final int COMMON_MAX_SPARES = 256;
private static volatile ForkJoinPool common;
public static void main(String[] args){
Arrays.asList(1,2,3).parallelStream().forEach(System.out::println);
}
```
这段简单的例子说明了即使不显式创建任何 `ForkJoinPool` 或者指定特定的线程池,只要使用 `.parallel()` 流就可以自动利用起底层优化过的并发结构来进行高效的数据处理。
阅读全文
相关推荐
















