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