ThreadPool使用方式说明

本文介绍了ThreadPool的使用方式及其优势,包括提升系统效率和资源管理。详细解析了ThreadPoolTaskExecutor的参数设置,如corePoolSize、maxPoolSize及queueCapacity,并讨论了它们之间的平衡关系。
摘要由CSDN通过智能技术生成

——转自http://blog.ithome.com.tw/index.php?op=ViewArticle&articleId=23037&blogId=1556

 

ThreadPool使用方式说明

 

為何要透過ThreadPool來管理Thread?為何要採用Pool的方式?當AP要使用Thread時不是直接New就好了嗎?

1、ThreadPool通常用來解決兩種問題:
A.效能提升
Thread本身也是一種資源,每次New Thread都會花掉系統一些成本,因此若系統作業環境是需要大量Thread來處理時(如Online交易),藉由ThreadPool來管理Thread如同藉由ConnectionPool來管理Connection一般,將可降低系統花在New Thread的成本

B.控制資源
透過ThreadPool來管理Thread可以有效控管系統資源並避免Thread無限制的產生,同時可以進行Thread量的統計


2、目前FOCAS是採用Spring提供之ThreadPoolTaskExecutor來運作
ThreadPool的管理共有3個參數可供相互設定:corePoolSize、maxPoolSize及queueCapacity,相互關係如下:
A.CorePool Size:設定ThreadPool可接受的主要Thread數量
因此若ActiveThread未超過CorePool Size,則ThreadPool會繼續New Thread

B.QueueCapacity:設定當Request超過CorePool Size時,可以先暫存的數量
因此若Request已經超過CorePool Size,則ThreadPool不會再New Thread,會先將Request放置於ArrayBlockingQueue
若此設定不為正整數,則ThreadPool會採用沒有限制的LinkedBlockingQueue,同時會忽略MaxPool Size的設定,也就是說Thread會無限制產生下去

C.MaxPool Size:設定當Queue滿的時候,最大Thread的數量
因此若Request超過CorePool Size,會先放入Queue中保存,若連Queue都滿了,這時候ThreadPool會再New Thread,直到等於MaxPool Size
當Request量牴觸到MaxPool Size時,ThreadPool會將後續Request丟掉,可以實作RejectedExecutionHandler來承接這些被丟掉的Request,後續再看看是要記錄到資料庫或進行其他處置

3、因此QueueCapacity及MaxPool Size的設定必須取得平衡點
A.若使用Queue大,MaxPool Size小
可以降低CPU及資源的使用,但對Online交易來說將會造成大量Request在Queue中無法立即處理,因此若是屬於即時性不高的作業,如HouseKeeping或傳檔,為了保護系統資源不被批次無限制吃光,倒是可以採用這樣的配置

B.若使用Queue小,MaxPool Size大
可以對Request作最即時的處理,但是相對來說CPU及記憶體的使用將會昇高,因此可透過MaxPool Size來保護系統,因此若是即時性的作業如Online交易,是有回覆時間的壓力並無法在Queue中慢慢等,因此可採用這種方式

上述的行為已經在FOCAS上實側過,實際數字必須經由量測來抓才準

4.Sun網站上有針對ThreadPool做很多的說明,可以參閱
http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值