public ThreadPoolTaskExecutor getExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(Runtime.getRuntime().availableProcessors() + 1);
    executor.setMaxPoolSize(20);
    executor.setQueueCapacity(100);
    executor.setThreadNamePrefix("HrMeeting-");
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    executor.initialize();
    return executor;
}

报错如下:java.lang.IllegalArgumentException: null

参考博客:ThreadPoolExecutor创建线程池启动项目报错问题 - 疯子110 - 博客园

核心原因:corePoolSize有可能大于等于maximumPoolSize,导致报错。

将代码修改为:

private ThreadPoolTaskExecutor getExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

    // 获取 CPU 逻辑线程数,并保证 corePoolSize 不超过 maxPoolSize
    int availableProcessors = Runtime.getRuntime().availableProcessors();
    int maxPoolSize = 20;
    int corePoolSize = Math.min(availableProcessors + 1, maxPoolSize);

    executor.setCorePoolSize(corePoolSize);
    executor.setMaxPoolSize(maxPoolSize);
    executor.setQueueCapacity(100);
    executor.setThreadNamePrefix("HrMeeting-");
    executor.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy());
    executor.initialize();
    return executor;
}

解决。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐