摘要:線程池維護線程所允許的空閑時間的單位線程池所使用的緩沖隊列一般采用阻塞隊列,有很多種無界阻塞隊列有界阻塞隊列同步移交隊列線程池對拒絕任務的處理策略丟棄任務并拋出異常。
一、線程池的概念
“池”,就是一個工廠,會提前生產出一些東西供使用。所以線程池就是處理多線程的一種方式。
其作用就在于:復用已有資源,控制資源總量
如果不使用線程池,那么:
(1)使用單線程,但是這種方式吞吐量非常低,且請求量一大效率就會顯得非常低。
(2)那如果對于每個請求都開一個線程去處理,這樣一旦請求量過大的時候,線程的創(chuàng)建和銷毀都要花費時間,并且線程本身也要占用一定的內存。
使用線程池后,既可以解決單線程低吞吐量和響應慢的問題,又解決了為每一個請求創(chuàng)建線程所耗費的資源問題。
線程池通過限制線程的數(shù)量,可以使線程數(shù)維持在一個合理的數(shù)量,充分發(fā)揮了CPU的作用。
而且,線程池遵循了生產者消費者模式,將任務的創(chuàng)建和執(zhí)行解耦。
三、ThreadPoolExecutorpublic class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler); }
這里是ThreadPoolExecutor最重要的一個構造方法
(1)corePoolSize : 線程池中維護線程的最少數(shù)量
當線程數(shù)少于corePoolSize時,就創(chuàng)建一條新的任務,不管是否有空閑的線程。
(2)maximumPoolSize: 線程池中維護線程的最大數(shù)量
當線程數(shù)到達corePoolSize,并且都不空閑,那么新任務都放到任務隊列中去。當任務隊列放滿之后,如果線程數(shù)小于maximumPoolSize,就繼續(xù)創(chuàng)建新線程。
(3)keepAliveTime:線程池維護線程所允許的空閑時間
如果線程空閑的時間超過keepAliveTime,那么就撤銷它。
(4)unit: 線程池維護線程所允許的空閑時間的單位
(5)workQueue: 線程池所使用的緩沖隊列
一般采用阻塞隊列,有很多種:
無界阻塞隊列、有界阻塞隊列、同步移交隊列
(6)handler: 線程池對拒絕任務的處理策略
AbortPolicy:丟棄任務并拋出RejectedExecutionException異常。
DiscardPolicy:也是丟棄任務,但是不拋出異常。
DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新嘗試執(zhí)行任務(重復此過程)
CallerRunsPolicy:由調用線程處理該任務
1、CachedThreadPool
先查看有沒有可用的線程,沒有再創(chuàng)建新線程
2、FixedThreadPool
與上一種差不多,但是不允許隨時創(chuàng)建新線程
任意時間點,最多只能有固定數(shù)目的活動線程存在,此時如果有新的線程要建立,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子。
3、ScheduledThreadPool
這個池子里的線程可以按 schedule 依次 delay 執(zhí)行,或周期執(zhí)行
4、SingleThreadExecutor
任意時間內池子里只能有一個線程。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75237.html
摘要:每個通過網(wǎng)絡到達服務器的連接都被包裝成一個任務并且傳遞給線程池。線程池的線程會并發(fā)的處理連接上的請求。用線程池控制線程數(shù)量,其他線程排隊等候。實現(xiàn)包,線程池頂級接口是但是嚴格意義講并不是一個線程。此線程池支持定時以及周期性執(zhí)行任務的需求。 tutorial site1tutorial site2 一個問題: 每啟動一個新線程都會有相應的性能開銷(涉及到OS的交互:創(chuàng)建線程,銷毀線程...
摘要:運行時數(shù)據(jù)區(qū)域的學習,是學習以及機制的基礎,也是深入理解對象創(chuàng)建及運行過程的前提。了解內存區(qū)域劃分,是學習概念的前提。 Java 運行時數(shù)據(jù)區(qū)域的學習,是學習 jvm 以及 GC 機制的基礎,也是深入理解 java 對象創(chuàng)建及運行過程的前提。廢話不多說,直接進入正題: 一張圖總結 showImg(https://segmentfault.com/img/bVOMAn?w=685&h=5...
摘要:方法可以將當前線程放入等待集合中,并釋放當前線程持有的鎖。此后,該線程不會接收到的調度,并進入休眠狀態(tài)。該線程會喚醒,并嘗試恢復之前的狀態(tài)。 并發(fā) 最近重新復習了一邊并發(fā)的知識,發(fā)現(xiàn)自己之前對于并發(fā)的了解只是皮毛。這里總結以下Java并發(fā)需要掌握的點。 使用并發(fā)的一個重要原因是提高執(zhí)行效率。由于I/O等情況阻塞,單個任務并不能充分利用CPU時間。所以在單處理器的機器上也應該使用并發(fā)。為...
閱讀 2090·2021-11-24 09:39
閱讀 1557·2021-10-11 10:59
閱讀 2502·2021-09-24 10:28
閱讀 3379·2021-09-08 09:45
閱讀 1272·2021-09-07 10:06
閱讀 1670·2019-08-30 15:53
閱讀 2065·2019-08-30 15:53
閱讀 1424·2019-08-30 15:53