ThreadPoolTaskExecutor写法
@Bean(name = "taskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(8); // 8核CPU服务器建议值executor.setMaxPoolSize(16); // 最大线程数executor.setQueueCapacity(1000); // 队列容量(根据业务峰值设置)executor.setKeepAliveSeconds(60); // 空闲线程存活时间executor.setThreadNamePrefix("biz-"); // 线程名前缀executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;
}
xml写法
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><property name="corePoolSize" value="8"/><property name="maxPoolSize" value="16"/><property name="queueCapacity" value="1000"/><property name="keepAliveSeconds" value="60"/><property name="threadNamePrefix" value="biz-pool-"/><property name="rejectedExecutionHandler"><bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/></property>
</bean>
Java代码配置与XML配置ThreadPoolTaskExecutor
的核心区别如下:
1. 配置形式差异
Java代码配置
通过编程方式动态设置参数,适合需要运行时调整的场景(如根据系统负载动态修改线程数)。
示例中通过setter
方法链式调用,可直接嵌入业务逻辑中进行条件判断。XML配置
静态声明式配置,适用于部署时确定的固定参数,修改需重启应用。
通过<property>
标签注入值,与Spring IOC容器深度集成。
2. 功能实现对比
特性 | Java代码配置 | XML配置 |
---|---|---|
线程池初始化时机 | 显式调用initialize() 或由Spring容器管理3 | 容器启动时自动初始化1 |
参数动态调整 | 支持运行时通过setCorePoolSize() 等修改16 | 需重新加载配置文件14 |
依赖注入灵活性 | 需手动处理依赖关系 | 可通过ref 引用其他Bean1 |
线程工厂定制 | 可直接注入自定义ThreadFactory 实例12 | 需额外声明Bean再通过ref 引用1 |
3. 实际应用场景
推荐Java代码配置
- 需要结合条件逻辑动态生成线程池参数(如根据CPU核心数计算线程数)
- 项目已采用JavaConfig风格统一管理Bean
推荐XML配置
- 传统Spring项目或需与遗留XML配置保持兼容
- 参数完全静态且需集中管理
4. 本质一致性
两者最终均转化为ThreadPoolExecutor
实例,核心参数(如corePoolSize
、queueCapacity
)的行为规则完全相同。差异仅体现在配置方式和扩展灵活性上