一:結構
執行緒池一般有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 可以看出進行一次資料庫連線是個相當昂貴的操作。沒有連線池的情況 來自部落格 如上圖,如果沒有連...