欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

這篇文章主要介紹“Java線程池是怎么實現的”,在日常操作中,相信很多人在Java線程池是怎么實現的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java線程池是怎么實現的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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

Java 線程池怎么玩

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

corePoolSize

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

workQueue

當用戶提交的任務數量變多了,這時候線程池中的線程數量已經達到核心線程數 C,那么只能將提交過來的任務暫存在 workQueue 隊列中。每當有線程處理完手頭上活的時候就會來工作隊列領取任務,如果隊列中沒有任務,那么當前線程就阻塞在隊列上,等待任務。工作隊列可以簡單分為 2 種:無界隊列和有界隊列。

無界隊列

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

有界隊列

如果我們傳入的是有界隊列,例如 ArrayBlockingQueue,那就需要考慮隊列存滿了怎么辦?不用擔心這個時候線程池會幫忙找一些臨時工來干活,這就需要用到下一個參數 maximumPoolSize 了。

maximumPoolSize

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

RejectedExexcutionHandler

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

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

keepAliveTime 和 TimeUnit

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

threadFactory

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

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

到此,關于“Java線程池是怎么實現的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

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

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

廣告

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

小程序開發(fā)