執行緒池原理和機制簡述

2021-08-20 05:42:10 字數 1540 閱讀 3724

一:結構

執行緒池一般有core 執行緒數,最大執行緒數和快取佇列(阻塞佇列)組成。

二:執行緒復用原理

執行緒池裡面的執行緒(真正執行緒,start 方法啟動的)執行業務執行緒物件(thread 或者runable 物件,但不是真正的執行緒)的run (非start方法)方法。

三:執行緒池邏輯

四:常用執行緒池

1:newfixedthreadpool

public static executorservice newfixedthreadpool(int nthreads)

其中最大執行緒和核心執行緒一致,用的是linkedblockingqueue,無限容量。

2:newsinglethreadexecutor

public static executorservice newsinglethreadexecutor()

其中最大執行緒和核心執行緒一致,用的是linkedblockingqueue,無限容量。

3:newcachedthreadpool

public static executorservice newcachedthreadpool()

全部外包,沒活最多待 60 秒的外包團隊。

可以看到,cachedthreadpool沒有核心執行緒,非核心執行緒數無上限,也就是全部使用外包,但是每個外包空閒的時間只有 60 秒,超過後就會被**。

cachedthreadpool使用的佇列是synchronousqueue,這個佇列的作用就是傳遞任務,並不會儲存。

因此當提交任務的速度大於處理任務的速度時,每次提交乙個任務,就會建立乙個執行緒。極端情況下會建立過多的執行緒,耗盡 cpu 和記憶體資源。

它的執行流程如下:

沒有核心執行緒,直接向synchronousqueue中提交任務

如果有空閒執行緒,就去取出任務執行;如果沒有空閒執行緒,就新建乙個

執行完任務的執行緒有 60 秒生存時間,如果在這個時間內可以接到新任務,就可以繼續活下去,否則就拜拜

由於空閒 60 秒的執行緒會被終止,長時間保持空閒的cachedthreadpool不會占用任何資源。

cachedthreadpool用於併發執行大量短期的小任務,或者是負載較輕的伺服器

4:newscheduledthreadpool

public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)

public scheduledthreadpoolexecutor(int corepoolsize)

private static final long default_keepalive_millis = 10l;

核心執行緒和最大執行緒都有,採用delayedworkqueue 佇列,最像第三章說的流程的執行緒池。

簡述執行緒池

首先我們來了解下執行緒池的相關概念,執行緒池是什麼。池,是容器,那顧名思義執行緒池就是管理執行緒的容器。很自然的我們會引出乙個問題,就是為什麼要使用執行緒池,而不是自己去管理多執行緒?在多執行緒應用場景中,會不斷建立和銷毀新的執行緒,而這會耗費大量的io資源,這樣過度消耗系統資源則有可能會導致系統奔...

執行緒池1 執行緒池原理

執行緒池可以看做容納執行緒的容器 乙個應用程式最多只能有乙個執行緒池 threadpool靜態類通過queueuserworkitem 方法將工作函式排入執行緒池 每排入乙個工作函式,就相當於請求建立乙個執行緒 執行緒池的作用 執行緒池是為突然大量爆發的執行緒設計的,通過有限的幾個固定執行緒為大量的...

連線池原理簡述

資料庫連線的生命週期 讓我看看連線一次資料庫要經歷哪些步驟 用 database driver 開啟乙個連線去連線資料庫 開啟乙個 tcp socket 讀寫資料 資料讀寫完畢 關閉連線 關閉socket 可以看出進行一次資料庫連線是個相當昂貴的操作。沒有連線池的情況 來自部落格 如上圖,如果沒有連...