多執行緒與高併發(九) 執行緒池

2021-10-20 19:33:07 字數 2005 閱讀 8376

執行緒池是執行緒的集合,它會初始化一些執行緒,當有任務提交給執行緒池時,執行緒池會分配空閒的執行緒去執行任務,執行結束之後,執行緒會再次成為空閒狀態,等待執行下乙個任務。

threadpoolexecutor 繼承了 abstractexecutorservice,而 abstractexecutorservice 實現了 executorservice 介面,故 threadpoolexecutor 是乙個執行緒池真正的實現類。

① executors.newfixedthreadpool(int):獲取乙個固定執行緒數量的執行緒池。

通過原始碼可以看到,newfixedthreadpool 獲取的是乙個不可擴充套件、任務佇列無限長、使用預設工廠方法生成執行緒、拒絕策略為 abortpolicy 的執行緒池。

public

static executorservice newfixedthreadpool

(int nthreads)

executors.newsinglethreadexecutor():獲取只有乙個執行緒數量的執行緒池。

通過原始碼可以看到,newsinglethreadexecutor 獲取的是乙個只有乙個執行緒、任務佇列無限長、使用預設工廠方法生成執行緒、拒絕策略為 abortpolicy 的執行緒池。

public

static executorservice newsinglethreadexecutor()

executors.newcachedthreadpool():獲取乙個可擴容的執行緒池。

通過原始碼可以看到,newcachedthreadpool 獲取的是乙個只有沒有核心執行緒、執行緒池最大執行緒數為max_value、擴充套件執行緒生存時間為60秒、任務佇列長度為1、使用預設工廠方法生成執行緒、拒絕策略為 abortpolicy 的執行緒池。

public

static executorservice newcachedthreadpool()

-執行緒池如何取最大執行緒數:cpu密集型:cpu核心數 + 1或2

cpu密集型也是指計算密集型,大部分時間用來做計算邏輯判斷等cpu動作的程式稱為cpu密集型任務。該型別的任務需要進行大量的計算,主要消耗cpu資源。 這種計算密集型任務雖然也可以用多工完成,但是任務越多,花在任務切換的時間就越多,cpu執行任務的效率就越低,所以,要最高效地利用cpu,計算密集型任務同時進行的數量應當約等於cpu的核心數。

io密集型:cpu核數 / 阻塞係數(通常取2倍cpu核數)

io密集型任務指任務需要執行大量的io操作,涉及到網路、磁碟io操作,對cpu消耗較少,其消耗的主要資源為io。

scheduledthreadpoolexecutor是定時任務執行緒池,它繼承了threadpoolexecutor,它在threadpoolexecutor的基礎上,擴充套件了延時執行任務、定時執行任務等功能。

public

static

void

main

(string[

] args)

throws executionexception, interruptedexception

未完待續

多執行緒與高併發

blocked 鎖池 timed waiting 定時等待 waiting 等待 terminated 禁止指令重排序 記憶體屏障 在單例雙重檢查中,不加會出現使用半初始化的值,也就是還未附初始值,指令重排導致的 類載入與指令重排的知識 public class spinlock while fla...

多執行緒高併發

修飾靜態方法鎖的是class,非靜態鎖方法鎖的是this,只有拿到這個物件才可以繼續執行 synchronized是可重入鎖 執行緒1的方法1呼叫執行緒2的方法2,判斷是同一把鎖,在同乙個執行緒,可以呼叫。synchronized的鎖公升級 hotsport 鎖公升級過程 保證執行緒可見性 mesi...

多執行緒高併發

個人總結,帶有個人主觀,請選擇性 1,實現 runable 2,使用 thread 3,執行緒池建立 executorse newcachedthreadpool 其實哪有那麼多建立方式,本質上都是實現了runable 介面。只列出大部分使用的方法,並未代表所有執行緒方法,後續會新增實際的例子,以供...