You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Executor的CompletableFuture是否在不同CPU核心运行?

关于CompletableFuture搭配Executor的CPU核心运行问题

核心分配逻辑

CompletableFuture搭配Executor运行时,任务的CPU核心分配不由Java API直接控制,而是由操作系统的线程调度器决定。线程池中的线程会被操作系统根据当前系统负载、核心空闲情况等调度策略,分配到不同的CPU核心上执行,并非固定在同一核心运行。Java层面只负责管理线程的创建、复用和任务提交,核心调度属于底层系统范畴,因此官方文档不会专门提及。

循环创建10个任务的运行情况

你用newFixedThreadPool(5)创建了包含5个线程的线程池,循环提交10个任务时,同一时间最多有5个任务并行执行。这5个线程会被操作系统调度到可用的CPU核心上——如果系统有多个空闲核心,大概率会分布在不同核心;但如果系统负载较高,也可能出现多个线程被调度到同一核心的情况。剩下的5个任务会进入线程池等待队列,等线程空闲后再被调度执行。

验证方法

可以通过Java的ThreadMXBeanAPI获取当前线程绑定的CPU核心ID,在任务中打印相关信息来验证。示例代码如下:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class CoreAssignmentTest {
    public static void main(String[] args) {
        Executor testExecutor = Executors.newFixedThreadPool(5);
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();

        // 循环创建10个任务
        for (int i = 0; i < 10; i++) {
            int taskNum = i;
            CompletableFuture.runAsync(() -> {
                long threadId = Thread.currentThread().getId();
                // 获取当前线程运行的CPU核心ID
                int coreId = threadMXBean.getThreadCurrentCpuCore(threadId);
                System.out.printf("任务%d | 线程ID: %d | 运行核心ID: %d%n", 
                        taskNum, threadId, coreId);
                // 模拟耗时任务,确保线程有足够时间被调度到核心
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }, testExecutor);
        }

        // 防止主线程提前退出
        try {
            Thread.sleep(12000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

运行后观察输出的核心ID分布,就能确认任务是否在不同核心上运行。

也可以用系统工具辅助验证:

  • Linux:用top命令按H显示线程,再按f添加P列查看线程绑定的CPU核心
  • Windows:打开任务管理器的「详细信息」选项卡,添加「CPU」列查看Java线程的核心分配情况

内容的提问来源于stack exchange,提问作者Toni26

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:27:25