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
)的行為規則完全相同。差異僅體現在配置方式和擴展靈活性上