温馨提示×

温馨提示×

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

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

java Executor执行器如何配置

发布时间:2026-09-30 06:09:12 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

在 Java 中,Executor / ExecutorService 是并发编程的核心组件,合理配置执行器对系统性能、稳定性和资源占用非常重要。下面从常见类型、配置参数、示例代码、调优建议几个方面说明。


一、Executor 常见类型

1. Executors 工具类(不推荐生产直接使用)

ExecutorService executor = Executors.newFixedThreadPool(10);

常见方法:

  • newFixedThreadPool(n):固定线程数
  • newCachedThreadPool():线程可无限增长
  • newSingleThreadExecutor():单线程
  • newScheduledThreadPool(n):定时任务

⚠️ 不推荐原因:

  • 默认使用 Integer.MAX_VALUE 队列
  • 容易 OOM(如 newCachedThreadPool)

二、推荐方式:手动配置 ThreadPoolExecutor

1. 核心参数说明

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler
)
参数 说明
corePoolSize 核心线程数(常驻)
maximumPoolSize 最大线程数
keepAliveTime 非核心线程空闲存活时间
workQueue 任务队列
threadFactory 线程工厂(命名、守护线程)
handler 拒绝策略

2. 标准配置示例

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    10,
    50,
    60L,
    TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(1000),
    new ThreadFactoryBuilder()
        .setNameFormat("biz-pool-%d")
        .build(),
    new ThreadPoolExecutor.CallerRunsPolicy()
);

三、任务队列选择

队列类型 特点
ArrayBlockingQueue 有界,固定大小
LinkedBlockingQueue 默认无界(要指定容量)
SynchronousQueue 不缓存任务,直接交给线程
PriorityBlockingQueue 支持优先级

✅ 生产环境必须有界队列


四、拒绝策略(RejectedExecutionHandler)

策略 说明
AbortPolicy 抛异常(默认)
CallerRunsPolicy 由调用线程执行
DiscardPolicy 直接丢弃
DiscardOldestPolicy 丢弃最老任务

示例:

new ThreadPoolExecutor.CallerRunsPolicy()

五、线程工厂(推荐)

使用 Guava:

new ThreadFactoryBuilder()
    .setNameFormat("order-task-%d")
    .setDaemon(false)
    .build();

或使用 JDK:

new ThreadFactory() {
    private final AtomicInteger count = new AtomicInteger(1);
    public Thread newThread(Runnable r) {
        return new Thread(r, "task-" + count.getAndIncrement());
    }
}

六、Spring 中的配置方式(常用)

1. @Async 线程池

@Configuration
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;
    }
}

七、调优建议(重点)

✅ CPU 密集型

corePoolSize = CPU核数 + 1

✅ IO 密集型

corePoolSize = CPU核数 * 2 或更高

✅ 监控

  • getActiveCount()
  • getQueue().size()
  • 配合 Micrometer / Prometheus

八、常见坑

❌ 使用 Executors.newFixedThreadPool() 无界队列
❌ 核心线程数 = 最大线程数但队列无限
❌ 不设置线程名(排查问题困难)
❌ 忽略拒绝策略


如果你有 具体场景(Web / 定时任务 / 高并发接口) 或 使用的框架(Spring Boot / Netty),我可以给你更精准的配置方案。

向AI问一下细节

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

AI
助
手