轉(zhuǎn)載請注明原創(chuàng)出處膀钠,謝謝弊琴!
持續(xù)在更新
http://www.reibang.com/p/ef3b78b1b69f
線程模型
如果事件處理的邏輯能迅速完成蛤育,并且不會發(fā)起新的 IO 請求荷逞,比如只是在內(nèi)存中記個標(biāo)識道伟,則直接在 IO 線程上處理更快迹缀,因?yàn)闇p少了線程池調(diào)度。
但如果事件處理邏輯較慢蜜徽,或者需要發(fā)起新的 IO 請求祝懂,比如需要查詢數(shù)據(jù)庫,則必須派發(fā)到線程池拘鞋,否則 IO 線程阻塞砚蓬,將導(dǎo)致不能接收其它請求。
如果用 IO 線程處理事件盆色,又在事件處理過程中發(fā)起新的 IO 請求灰蛙,比如在連接事件中發(fā)起登錄請求祟剔,會報“可能引發(fā)死鎖”異常,但不會真死鎖摩梧。
因此物延,需要通過不同的派發(fā)策略和不同的線程池配置的組合來應(yīng)對不同的場景:
Dispatcher
all?所有消息都派發(fā)到線程池,包括請求仅父,響應(yīng)叛薯,連接事件,斷開事件笙纤,心跳等耗溜。
direct?所有消息都不派發(fā)到線程池,全部在 IO 線程上直接執(zhí)行省容。
message?只有請求響應(yīng)消息派發(fā)到線程池抖拴,其它連接斷開事件,心跳等消息腥椒,直接在 IO 線程上執(zhí)行城舞。
execution?只請求消息派發(fā)到線程池,不含響應(yīng)寞酿,響應(yīng)和其它連接斷開事件家夺,心跳等消息,直接在 IO 線程上執(zhí)行伐弹。
connection?在 IO 線程上拉馋,將連接斷開事件放入隊(duì)列,有序逐個執(zhí)行惨好,其它消息派發(fā)到線程池煌茴。
ThreadPool
fixed?固定大小線程池,啟動時建立線程日川,不關(guān)閉蔓腐,一直持有。(缺省)
cached?緩存線程池龄句,空閑一分鐘自動刪除回论,需要時重建。
limited?可伸縮線程池分歇,但池中的線程數(shù)只會增長不會收縮傀蓉。只增長不收縮的目的是為了避免收縮時突然來了大流量引起的性能問題。
eager?優(yōu)先創(chuàng)建Worker線程池职抡。在任務(wù)數(shù)量大于corePoolSize但是小于maximumPoolSize時葬燎,優(yōu)先創(chuàng)建Worker來處理任務(wù)。當(dāng)任務(wù)數(shù)量大于maximumPoolSize時,將任務(wù)放入阻塞隊(duì)列中谱净。阻塞隊(duì)列充滿時拋出RejectedExecutionException窑邦。(相比于cached:cached在任務(wù)數(shù)量超過maximumPoolSize時直接拋出異常而不是將任務(wù)放入阻塞隊(duì)列)