Java 21中使用newVirtualThreadPerTaskExecutor时平台线程数量是多少?
关于
Executors.newVirtualThreadPerTaskExecutor()的平台线程数量问题 当你使用Executors.newVirtualThreadPerTaskExecutor()创建虚拟线程执行器时,没有直接的API可以指定平台线程的数量,因为它默认依赖JVM的虚拟线程调度器,而调度器底层使用ForkJoinPool.commonPool()作为载体平台线程池。
默认平台线程数量的计算逻辑
默认情况下,平台线程的数量等于ForkJoinPool.commonPool()的并行度,其值由JVM自动计算:
- 公式为
Runtime.getRuntime().availableProcessors() - 1,但如果可用处理器数为1,则并行度固定为1。 - 对于你的Macbook M1 Pro(假设是10逻辑核心),默认平台线程数会是9;如果是8逻辑核心则为7。你可以通过
ForkJoinPool.commonPool().getParallelism()代码直接验证当前数值。
如何自定义平台线程数量
如果你需要手动指定平台线程数,有两种可行方式:
通过系统属性修改commonPool并行度:
在启动Java程序时添加JVM参数,例如:java -Djava.util.concurrent.ForkJoinPool.common.parallelism=4 YourMainClass这会将平台线程数强制设置为4。
自定义调度器平台线程池:
若不想依赖默认的commonPool,可以自行创建ForkJoinPool或ThreadPoolExecutor作为虚拟线程的调度器,示例代码如下:// 创建并行度为4的自定义平台线程池 ForkJoinPool customPool = new ForkJoinPool(4); // 创建绑定该平台线程池的虚拟线程工厂 ThreadFactory virtualThreadFactory = Thread.ofVirtual().scheduler(customPool).factory(); // 构建自定义虚拟线程执行器 ExecutorService customExecutor = Executors.newThreadPerTaskExecutor(virtualThreadFactory);
内容的提问来源于stack exchange,提问作者Mangat Rai Modi
相关产品推荐
相关产品推荐

