Java線程池是怎么實(shí)現(xiàn)的-創(chuàng)新互聯(lián)

這篇文章主要介紹“Java線程池是怎么實(shí)現(xiàn)的”,在日常操作中,相信很多人在Java線程池是怎么實(shí)現(xiàn)的問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java線程池是怎么實(shí)現(xiàn)的”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括大荔網(wǎng)站建設(shè)、大荔網(wǎng)站制作、大荔網(wǎng)頁(yè)制作以及大荔網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,大荔網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到大荔省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

Java 線程池怎么玩

想玩明白 Java 的線程池,只需要的知道構(gòu)建線程池的幾個(gè)參數(shù)具體的含義基本上就明了了。那么接下來(lái),就讓我們一一瓦解這些參數(shù)。

corePoolSize

我們假設(shè)有 N 個(gè)任務(wù)需要提交到線程池去處理,當(dāng)任務(wù)數(shù)量 N 小于核心線程數(shù) corePoolSize(后文用 C 來(lái)代替) 的時(shí)候,線程池會(huì)不斷新建線程來(lái)處理用戶提交進(jìn)來(lái)的任務(wù)即使有線程空閑。C 其實(shí)代表的是線程池通常情況下會(huì)保留的線程數(shù)量(如果將線程池比作一個(gè)工廠,C 可以類比為工廠的正式編制人員數(shù)量),當(dāng)任務(wù)數(shù)量 N 超過核心線程數(shù)量 C 的時(shí)候,線程池就要用到下一個(gè)參數(shù) workQueue 了。

workQueue

當(dāng)用戶提交的任務(wù)數(shù)量變多了,這時(shí)候線程池中的線程數(shù)量已經(jīng)達(dá)到核心線程數(shù) C,那么只能將提交過來(lái)的任務(wù)暫存在 workQueue 隊(duì)列中。每當(dāng)有線程處理完手頭上活的時(shí)候就會(huì)來(lái)工作隊(duì)列領(lǐng)取任務(wù),如果隊(duì)列中沒有任務(wù),那么當(dāng)前線程就阻塞在隊(duì)列上,等待任務(wù)。工作隊(duì)列可以簡(jiǎn)單分為 2 種:無(wú)界隊(duì)列和有界隊(duì)列。

無(wú)界隊(duì)列

如果我創(chuàng)建線程池的傳入的是無(wú)界隊(duì)列,那么意味著用戶可以源源不斷的提交任務(wù)到線程池,而不需要擔(dān)心線程池拒絕接收,例如 LinkedBlockingQueue 就是一種選擇。

有界隊(duì)列

如果我們傳入的是有界隊(duì)列,例如 ArrayBlockingQueue,那就需要考慮隊(duì)列存滿了怎么辦?不用擔(dān)心這個(gè)時(shí)候線程池會(huì)幫忙找一些臨時(shí)工來(lái)干活,這就需要用到下一個(gè)參數(shù) maximumPoolSize 了。

maximumPoolSize

此時(shí)所有的核心線程都在干活,而且工作隊(duì)列也存滿了任務(wù)。如果還是有任務(wù)提交進(jìn)來(lái),那么線程池會(huì)再創(chuàng)建新的線程來(lái)幫助工作(可以類比為一個(gè)工廠,管理員發(fā)現(xiàn)任務(wù)太多,倉(cāng)庫(kù)也堆滿了任務(wù)需要雇傭一些臨時(shí)工來(lái)幫助干活)。當(dāng)然臨時(shí)工也不能雇傭太多,畢竟工廠資源有限,需要設(shè)定工廠里面工人較大上限,這個(gè)就是 maximumPoolSize 了。然而瘋狂的用戶哪管你能不能處理完任務(wù),還是不斷的提交任務(wù)進(jìn)來(lái),這個(gè)時(shí)候線程池忍無(wú)可忍了,關(guān)門拒絕用戶提交新的任務(wù),這時(shí)候 RejectedExexcutionHandler 就要開始發(fā)揮作用了。

RejectedExexcutionHandler

線程池共提供了如下 4 種拒絕策略AbortPolicy 策略會(huì)拋出一個(gè) RejectedExecutionException 異常給用戶,告訴它任務(wù)被拒絕了。DiscardPolicy 策略當(dāng)任務(wù)來(lái)臨時(shí)候不會(huì)給用戶任何反饋,悄無(wú)聲息拒絕任務(wù)。DiscardOldestPolicy 策略比較霸道,它會(huì)直接將最早存儲(chǔ)在工作隊(duì)列的任務(wù)丟棄掉,然后再試圖去執(zhí)行當(dāng)前提交進(jìn)來(lái)的任務(wù)。CallerRunsPolicy 策略呢雖然線程池中的工人不幫忙處理任務(wù)了,它會(huì)占用用戶線程去處理當(dāng)前任務(wù),這也就意味著用戶線程要處理完當(dāng)前任務(wù)才可以做其他事情。

使用上面的幾個(gè)核心參數(shù)完美的解決了任務(wù)的提交流程和工作分配問題,接下來(lái)就要來(lái)考慮一下后面的工作了。用戶提交了一大波任務(wù)以后,就不在提交了。這時(shí)候線程池的中工人都還在呢,如果一直保留這些資源但是又沒有活干,會(huì)造成資源的浪費(fèi)。這時(shí)候就需要用到 keepAliveTime 和 TimeUnit 參數(shù)了。

keepAliveTime 和 TimeUnit

這 2 個(gè)參數(shù)組合起來(lái)決定了一個(gè)工人最多可以在工廠里愉快的摸魚時(shí)間,如果摸魚時(shí)間超過這個(gè)限度,這個(gè)工人資源就會(huì)被釋放,也就是這個(gè)空閑線程資源就被回收掉咯。當(dāng)然啦,線程池會(huì)保留核心線程在工廠里面等待新任務(wù),以備有新任務(wù)的到來(lái),我們也可以通過 public void allowCoreThreadTimeOut(boolean value) 方法設(shè)置參數(shù),來(lái)允許線程池也可以釋放核心線程。

threadFactory

還剩下最后一個(gè)參數(shù),它比較簡(jiǎn)單,主要用來(lái)創(chuàng)建線程,例如我們想讓線程池中的線程做一些定制化的工作就可以自己來(lái)定義線程工廠,這樣線程池創(chuàng)建線程的時(shí)候就使用我們指定的工廠了。

你可能會(huì)覺得構(gòu)建一個(gè)線程還要設(shè)置這么參數(shù),太麻煩了,貼心的 JDK 幫我們?cè)?Executors 中準(zhǔn)備了幾個(gè)靜態(tài)工廠方法,我們一起看一下它們的特性:newFixedThreadPool(int nThreads) 可以創(chuàng)建一個(gè)固定線程數(shù)量的線程池,同時(shí)它的工作隊(duì)列是一個(gè)無(wú)界隊(duì)列。newSingleThreadExecutor() 可以創(chuàng)建只有一個(gè)線程工作的線程池,同時(shí)它的工作隊(duì)列也是無(wú)界隊(duì)列。newCachedThreadPool() 可以創(chuàng)建一個(gè)沒上限工作線程的線程池,它使用了 SynchronousQueue 只要有任務(wù)過來(lái),如果有空閑的線程,會(huì)優(yōu)先利用空閑的線程池,沒有空閑線程就會(huì)新創(chuàng)建線程。newSingleThreadScheduledExecutor() 創(chuàng)建的是一個(gè)具有延遲和循環(huán)執(zhí)行任務(wù)線程池,同時(shí)它內(nèi)部也只有一個(gè)線程,它的工作隊(duì)列是一個(gè)具有延遲功能的隊(duì)列 DelayedWorkQueue。newWorkStealingPool() 這種方法是 Java 8 提供的,它實(shí)際創(chuàng)建的是一個(gè) ForkJoinTool 而不是 ThreadPoolExecutor 的實(shí)例。如上即為 5 中創(chuàng)建線程池的工廠方法,大家根據(jù)需要選擇適合自己工作的,當(dāng)然也可以直接使用 ThreadPoolExecutor 來(lái)創(chuàng)建一個(gè)。

到此,關(guān)于“Java線程池是怎么實(shí)現(xiàn)的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

新聞名稱:Java線程池是怎么實(shí)現(xiàn)的-創(chuàng)新互聯(lián)
瀏覽地址:http://muchs.cn/article6/ceseog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、電子商務(wù)移動(dòng)網(wǎng)站建設(shè)、云服務(wù)器、網(wǎng)站改版、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開發(fā)