乙個簡單執行緒的建立和銷毀如下**,與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒**也會給gc帶來巨大的壓力。為了解決這樣的問題,那麼執行緒池應運而生。
new thread(new runnable()
}).start();
執行緒池和資料庫連線池是類似的概念,在池中總有那麼幾個活躍的執行緒,當程式中線程時,從池中取出乙個,用完後不直接關閉,而是放回池中。
public static executorservice newfixedthreadpool(int nthreads)
newfixedthreadpool() :返回乙個固定執行緒數量的執行緒池,當乙個任務來時,如果有空閒的執行緒,那麼就立即執行,否則就將任務放到快取佇列。
public static scheduledexecutorservice newsinglethreadscheduledexecutor()
newsinglethreadexecutor() :返回只有乙個執行緒的執行緒池,如果有任務來,空閒就處理,否則放入快取佇列。
public static executorservice newcachedthreadpool()
newcachedthreadpool() :返回乙個可根據實際情況調整執行緒數量的執行緒池,數量不確定,但是空閒的執行緒可以優先復用,當任務來時,若有空閒執行緒就復用,否則建立新的執行緒,使用完畢後返回執行緒池復用。
public static executorservice newsinglethreadexecutor()
newsinglethreadscheduledexecutor(): 返回乙個scheduledexecutorservice 物件,執行緒池大小為1,scheduledexecutorservice 可以給定時間執行某個任務,或者週期性的執行某個任務。
public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)
newscheduledthreadpool(int corepoolsize): 也是返回乙個scheduledexecutorservice物件,但是可以指定執行緒池中線程的數量。
/**
* * @param corepoolsize 執行緒池中線程的數量
* @param maximumpoolsize 最大執行緒數量
* @param keepalivetime 執行緒數超過指定的數量,多於執行緒的最大存活時間
* @param unit 存活時間的單位
* @param workqueue 任務佇列,提交,但是還沒有執行的任務
* @param threadfactory 建立執行緒的工廠
* @param handler 任務太多時,拒絕任務的策略
*/public threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue,
threadfactory threadfactory,
rejectedexecutionhandler handler)
threadpoolexecutor 的構造函式引數中,其他的都比較簡單,詳細看一下 workqueue (任務佇列)和 handler ( 拒絕策略)
workqueue :blockingqueue介面的物件,實現有如下
直接提交的佇列 (synchronousqueue)
有界的任務佇列 (arrayblockingqueue)
無界的任務佇列 (linkedblockingqueue)
優先任務佇列 (priorityqueue)
handler 拒絕策略 :jdk內建了四種拒絕策略如下:
abortpolicy:直接丟擲異常,組織系統正常工作。
callerrunspolicy: 只要執行緒池沒有關閉,該策略直接在呼叫者的執行緒中,執行被丟棄的任務,雖然不會真的丟失任務,但是任務提交執行緒的效能會下降。
discardoldestpolicy:該策略將丟棄最老的乙個請求
discardpolicy:直接丟棄無法處理的任務
如上圖看到的,所有的拒絕策略都是 rejectedexecutionhandler 介面的實現,如果以上的策略無法滿足生產環境的要求,也可以自定義拒絕策略。
下面是乙個例子:
public class extthreadpool
}) @override
protected void afterexecute(runnable r, throwable t)
@override
protected void terminated()
};for (int i = 0; i < 5; i++)
es.shutdown();
} // 靜態內部類
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
mysql 執行緒池 c MySQL執行緒池
mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...
mysql 執行緒池 Mysql 執行緒池
why 在5.6以前,mysql會對每個連線建立乙個執行緒,請求結束後銷毀執行緒。在高併發的情況下,為了避免頻繁建立和釋放連線,可以通過thread cache將執行緒快取起來,請求來了先嘗試從cache中獲取,重複利用執行緒資源。問題在低併發的情況下,thread cache可以成為乙個有效的優化...