今天作了一個需求要求登陸系統後記錄全部人的全部操做,因爲該類型操做任務量小可是卻不少,因此想到了用線程池,實現異步操做,避免同步操做影響性能。選擇了spring的線程池基於xml配置文件進行配置。線程數和隊列項目實際狀況進行配置
Java提供了4鍾線程池:
newCachedThreadPool
特性:
- 它是一個能夠無限擴大的線程池;
- 它比較適合處理執行時間比較小的任務(只有任務小,線程數比較多才能複用);
- corePoolSize爲0,maximumPoolSize爲無限大,意味着線程數量能夠無限大;
- keepAliveTime爲60S,意味着線程空閒時間超過60S就會被殺死;
- 採用SynchronousQueue裝等待的任務,這個阻塞隊列沒有存儲空間,這意味着只要有請求到來,就必需要找到一條工做線程處理他,若是當前沒有空閒的線程,那麼就會再建立一條新的線程。
newFixedThreadPool
特性:建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待
newSingleThreadExecutor
特性:
- 它只會建立一條工做線程處理任務;
- 採用的阻塞隊列爲LinkedBlockingQueue
newScheduledThreadPool
特性:支持定時及週期性任務執行
spring提供了一個threadPoolTaskExecutor 線程池
須要關注,線程數,隊列類型,拒絕策略
這幾篇文章講解的比較好: