温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Executor 执行器如何配置

发布时间:2026-11-10 00:05:27 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

在 Java 中,Executor / ExecutorService 是用来管理线程池和执行任务的。配置方式主要取决于你使用的是 JDK 原生 API 还是 Spring 框架。下面分场景说明。


一、JDK 原生 Executor 配置

1. 使用 Executors(快捷方式,不推荐生产)

ExecutorService executor = Executors.newFixedThreadPool(10);

常见方法:

  • newFixedThreadPool(n):固定线程数
  • newCachedThreadPool():线程可复用、无线程数限制
  • newSingleThreadExecutor():单线程
  • newScheduledThreadPool(n):定时任务

⚠️ 问题:可能创建无界队列或无限线程,容易导致 OOM


2. 推荐:使用 ThreadPoolExecutor(手动配置)

ThreadPoolExecutor executor = new ThreadPoolExecutor(
        10,                      // 核心线程数
        50,                      // 最大线程数
        60L,                     // 空闲线程存活时间
        TimeUnit.SECONDS,
        new LinkedBlockingQueue<>(1000), // 任务队列
        Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);

关键参数说明

参数 说明
corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime 非核心线程空闲存活时间
workQueue 任务队列
threadFactory 线程创建工厂
rejectedExecutionHandler 拒绝策略

常见拒绝策略

  • AbortPolicy(默认,抛异常)
  • CallerRunsPolicy(调用者线程执行)
  • DiscardPolicy(直接丢弃)
  • DiscardOldestPolicy(丢弃最老任务)

二、Spring 中配置 Executor

1. @Async + ThreadPoolTaskExecutor

@Configuration
@EnableAsync
public class ExecutorConfig {

    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(50);
        executor.setQueueCapacity(1000);
        executor.setThreadNamePrefix("async-");
        executor.setRejectedExecutionHandler(
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
        executor.initialize();
        return executor;
    }
}

使用:

@Async
public void doTask() {
    // 异步执行
}

2. 定时任务 Executor(Spring Schedule)

@Bean
public Executor scheduledExecutor() {
    return Executors.newScheduledThreadPool(5);
}

三、参数配置建议

  • CPU 密集型:corePoolSize = CPU 核数
  • IO 密集型:corePoolSize = CPU 核数 * 2
  • 队列不要无界
  • 必须有拒绝策略
  • 线程名要有前缀(便于排查问题)

四、常见错误

❌ 使用 Executors.newCachedThreadPool() 处理高并发
❌ 队列无限大
❌ 忘记 initialize()(Spring 中)
❌ 不设置拒绝策略


如果你有具体使用场景(如 Web 请求、定时任务、批量处理),我可以给你更合适的配置示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手