Insight spring-task:executor

炸雞店老闆發表於2017-11-21

最近優化跑數的job,主要思路是序列拆分為並行,執行單元重構(呼叫外部介面需要非同步)。

首先,嘗試了guava 的ListeningExecutorService,對於多執行緒的操作確實非常方便。但不適用於我們這個場景,併發的粒度沒有那麼細,相對於實時響應的系統,job 不需要這樣複雜的編碼。

然後,繼續使用喜愛的spring @Async,編碼量小,體現更多的是設計,只要合理拆分執行單元,就可以輕鬆達到優化的效果。


使用過程中,針對task:executor 實現記錄如下:

1.  不指定executor,spring 提供預設的多執行緒實現SimpleAsyncTaskExecutor (為每個task 建立Thread)。

2.  如果指定executor,則根據引數最終建立ThreadPoolExecutor

3.  引數pool-size,可以為n or n-m 表示式,只配置n,相當於core-size = max-size = n;配置n-m,相當於配置core-size = n, max-size = m。

4.  引數queueCapacity,rejection-policy 相對應,預設情況是queue滿, abort。

5.  引數keep-alive,具體初始化為ThreadPoolExecutor 的keepAliveTime,單位為s


例項化: new ThreadPoolExecutor(this.corePoolSize, this.maxPoolSize, this.keepAliveSeconds,TimeUnit.SECONDS, queue, threadFactory, rejectedExecutionHandler);

相關文章