建立執行緒池的一種方式:
threadpoolexecutor threadpoolexecutor = new threadpoolexecutor(corepoolsize, maximumpoolsize, keepalivetime, unit, workqueue, threadfactory, handler);
引數說明:
/**建立執行緒池物件
* @param corepoolsize 核心執行緒數,執行緒池中可以保留的執行緒數-----自定義int值 3
* @param maximumpoolsize最大執行緒數(包括了核心執行緒池數量),當執行緒池中線程數量超過corepoolsize,空閒的執行緒達到keepalivetime時間後銷毀,為了節省資源,動態調整執行緒池中的執行緒數--自定義int值 5,
* @param keepalivetime空閒執行緒的存活時間--自定義int值
* @param unit 存活時間的單位----有多種單位可選擇
* @param workqueue阻塞等待的任務佇列,一般使用new linkedblockingqueue()這個,如果不指定容量,會一直往裡邊新增,沒有限制,workqueue永遠不會滿;--自定義int值,也可以不賦值,表示無限制的快取任務
* @param threadfactory執行緒工廠--建立執行緒的工廠,使用系統預設的類
* @param handler異常處理機制--一當任務數超過maximumpoolsize時,對任務的處理策略,預設策略是拒絕新增
* */
threadpoolexecutor threadpoolexecutor = new threadpoolexecutor(3, 5,10, timeunit.seconds, new linkedblockingdeque(), executors.defaultthreadfactory(),new threadpoolexecutor.abortpolicy());
執行流程:當執行緒數小於corepoolsize時,每新增乙個任務,則立即開啟新執行緒執行;
當corepoolsize滿的時候,後面新增的任務將放入緩衝佇列workqueue等待;
當workqueue也滿的時候,看執行緒數是否超過maximumpoolsize,如果沒有超過,則立即開啟新執行緒執行,
如果超過,預設拒絕執行
舉例說明:
假如:corepoolsize=2,maximumpoolsize=3,workqueue容量為8;
最開始,執行的任務a,b,此時corepoolsize已用完,再次執行任務c,則
c將被放入緩衝佇列workqueue中等待著,如果後來又新增了7個任務,此時workqueue已滿,
則後面再來的任務將會和maximumpoolsize比較,由於maximumpoolsize為3,所以只能容納1個了,
因為有2個在corepoolsize中執行了,所以後面來的任務預設都會被拒絕。
理解執行緒池
為什麼要使用執行緒池?我們使用乙個執行緒的步驟 1.建立執行緒 2.使用執行緒 3.銷毀執行緒 每使用乙個執行緒必須經過這三個步驟,如果步驟1,和步驟3所需要的時間和大於步驟2,我們就得思考,會不會本末倒置,怎麼樣提高效能?縮短建立和銷毀執行緒的時間!當乙個執行緒完成自己的工作後,不去銷毀它,讓它繼...
執行緒池學習理解
1.執行緒池是什麼 為了避免系統頻繁地建立和銷毀執行緒,我們可以讓建立的執行緒進行復用。如果大家進行過資料庫開發,對資料庫連線池應該不會陌生。為了避免每次資料庫查詢都重新建立和銷毀資料庫連線,我們可以使用資料庫連線池維護一些資料庫連線,讓他們長期保持在乙個啟用狀態。當系統需要使用資料庫時,並不是建立...
執行緒池的理解
原來一直對執行緒池心存疑惑.第乙個疑惑是.執行緒類在例項化的時候就已經指定了run函式了,也就是說,乙個執行緒在例項化的時候,他能做什麼就已經定下來了,要做別的事,就要新開乙個執行緒.這感覺就和執行緒池的思想違背了,怎麼樣從執行緒池裡面拿乙個執行緒出來就可以執行呢?執行完了然後再放回去呢?第二個疑惑...