Java線程池7個參數(shù)的詳細(xì)含義
java多線程開發(fā)時,常常用到線程池技術(shù),這篇文章是對創(chuàng)建java線程池時的七個參數(shù)的詳細(xì)解釋。
從源碼中可以看出,線程池的構(gòu)造函數(shù)有7個參數(shù)
這 7 個參數(shù)分別是:
- corePoolSize:核心線程數(shù)。
- maximumPoolSize:最大線程數(shù)。
- keepAliveTime:空閑線程存活時間。
- TimeUnit:時間單位。
- BlockingQueue:線程池任務(wù)隊(duì)列。
- ThreadFactory:創(chuàng)建線程的工廠。
- RejectedExecutionHandler:拒絕策略。
下面會對這7個參數(shù)一一解釋。
一、corePoolSize 線程池核心線程大小
線程池中會維護(hù)一個最小的線程數(shù)量,即使這些線程處理空閑狀態(tài),他們也不會被銷毀,除非設(shè)置了allowCoreThreadTimeOut。這里的最小線程數(shù)量即是corePoolSize。
二、maximumPoolSize 線程池最大線程數(shù)量
一個任務(wù)被提交到線程池以后,首先會找有沒有空閑存活線程,如果有則直接將任務(wù)交給這個空閑線程來執(zhí)行,如果沒有則會緩存到工作隊(duì)列(后面會介紹)中,如果工作隊(duì)列滿了,才會創(chuàng)建一個新線程,然后從工作隊(duì)列的頭部取出一個任務(wù)交由新線程來處理,而將剛提交的任務(wù)放入工作隊(duì)列尾部。線程池不會無限制的去創(chuàng)建新線程,它會有一個最大線程數(shù)量的限制,這個數(shù)量即由maximunPoolSize指定。
三、keepAliveTime 空閑線程存活時間
一個線程如果處于空閑狀態(tài),并且當(dāng)前的線程數(shù)量大于corePoolSize,那么在指定時間后,這個空閑線程會被銷毀,這里的指定時間由keepAliveTime來設(shè)定
四、unit 空閑線程存活時間單位
keepAliveTime的計(jì)量單位
五、workQueue 工作隊(duì)列
新任務(wù)被提交后,會先進(jìn)入到此工作隊(duì)列中,任務(wù)調(diào)度時再從隊(duì)列中取出任務(wù)。jdk中提供了四種工作隊(duì)列:
①ArrayBlockingQueue
基于數(shù)組的有界阻塞隊(duì)列,按FIFO排序。新任務(wù)進(jìn)來后,會放到該隊(duì)列的隊(duì)尾,有界的數(shù)組可以防止資源耗盡問題。當(dāng)線程池中線程數(shù)量達(dá)到corePoolSize后,再有新任務(wù)進(jìn)來,則會將任務(wù)放入該隊(duì)列的隊(duì)尾,等待被調(diào)度。如果隊(duì)列已經(jīng)是滿的,則創(chuàng)建一個新線程,如果線程數(shù)量已經(jīng)達(dá)到maxPoolSize,則會執(zhí)行拒絕策略。
②LinkedBlockingQuene
基于鏈表的無界阻塞隊(duì)列(其實(shí)最大容量為Interger.MAX),按照FIFO排序。由于該隊(duì)列的近似無界性,當(dāng)線程池中線程數(shù)量達(dá)到corePoolSize后,再有新任務(wù)進(jìn)來,會一直存入該隊(duì)列,而不會去創(chuàng)建新線程直到maxPoolSize,因此使用該工作隊(duì)列時,參數(shù)maxPoolSize其實(shí)是不起作用的。
③SynchronousQuene
一個不緩存任務(wù)的阻塞隊(duì)列,生產(chǎn)者放入一個任務(wù)必須等到消費(fèi)者取出這個任務(wù)。也就是說新任務(wù)進(jìn)來時,不會緩存,而是直接被調(diào)度執(zhí)行該任務(wù),如果沒有可用線程,則創(chuàng)建新線程,如果線程數(shù)量達(dá)到maxPoolSize,則執(zhí)行拒絕策略。
④PriorityBlockingQueue
具有優(yōu)先級的無界阻塞隊(duì)列,優(yōu)先級通過參數(shù)Comparator實(shí)現(xiàn)。
六、threadFactory 線程工廠
創(chuàng)建一個新線程時使用的工廠,可以用來設(shè)定線程名、是否為daemon線程等等
七、handler 拒絕策略
當(dāng)工作隊(duì)列中的任務(wù)已到達(dá)最大限制,并且線程池中的線程數(shù)量也達(dá)到最大限制,這時如果有新任務(wù)提交進(jìn)來,該如何處理呢。這里的拒絕策略,就是解決這個問題的,jdk中提供了4中拒絕策略:
①CallerRunsPolicy
該策略下,在調(diào)用者線程中直接執(zhí)行被拒絕任務(wù)的run方法,除非線程池已經(jīng)shutdown,則直接拋棄任務(wù)。
②AbortPolicy
該策略下,直接丟棄任務(wù),并拋出RejectedExecutionException異常。
③DiscardPolicy
該策略下,直接丟棄任務(wù),什么都不做。
④DiscardOldestPolicy
該策略下,拋棄進(jìn)入隊(duì)列最早的那個任務(wù),然后嘗試把這次拒絕的任務(wù)放入隊(duì)列
到此這篇關(guān)于Java線程池7個參數(shù)的詳細(xì)含義的文章就介紹到這了,更多相關(guān)Java線程池參數(shù)含義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案
這篇文章主要介紹了Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解
這篇文章主要介紹了Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解,有些朋友可能不了解過濾器、監(jiān)聽器和攔截器的區(qū)別,本文就來詳細(xì)講一下,相信看完你會有所收獲,需要的朋友可以參考下2024-01-01java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值
這篇文章主要介紹了java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06