核心執行緒:執行緒在初始化期間建立出來,這樣使用完了扔給下乙個可以重用;開銷少,但會占用記憶體;臨時執行緒:執行緒用完了就扔掉,每次請求都會新建乙個執行緒;開銷大,但是節約記憶體;
執行緒池分類:週期、臨時、定長;
執行緒池核心:佇列、wokder裝飾器
物件池思想:池屬性裝飾器-引用-清洗
執行緒池應用:執行緒池一般只建立一次;但是執行submit、execute方法可以執行多次來建立多個執行緒;
單執行緒池: executorservice executor=executors.
newsinglethreadexecutor()
;//序列執行執行緒,保證了訪問順序
定長線程池: executorservice executor=executors.
newfixedthreadpool(5
);//--->全是核心!超過則阻塞佇列,空閒則重用
快取型池: executorservice executor=executors.
newcachedthreadpool()
;//--->沒有核心執行緒,全是臨時執行緒;週期性短的非同步任何可以用這個,超時移除
定時執行緒池:scheduledexecutorservice executor = executors.
newscheduledthreadpool(5
);runnable task =
newrunnable()
};executor.
scheduleatfixedrate
(task,5,
3, timeunit.seconds)
;//5秒後第一次執行,之後每隔3秒執行一次
基礎定義
時間和空間的選擇;
newthreadpoolexecutor
(int corepoolsize,
//核心執行緒池大小,核心執行緒池內及時沒任務也不會清除,加入阻塞佇列
int maximumpoolsize,
//總體執行緒池大小(核心+臨時不能大於這個數,不然直接拒絕);
long keepalivetime,
//臨時執行緒存貨時間
timeunit unit,
//時間的單位
blockingqueue
workqueue,
//超過執行緒池大小的時的執行緒會被放到這裡佇列內,由外部傳入);
時間策略單位:
timeunit.days;
//天 timeunit.hours;
//小時
timeunit.minutes;
//分鐘
timeunit.seconds;
//秒 timeunit.milliseconds;
//毫秒
timeunit.microseconds;
//微妙
timeunit.nanoseconds;
//納秒
應用舉例
這種是繼承實現,也可以用嵌入法實現
public
class
myexcutorservcie
extends
threadpoolexecutor;}
public
static
void
main
(string[
] args)})
;}
runnable用法
public
static
void
main
(string[
] args)})
;}
callable用法
public
static
void
main
(string[
] args)
/** * 業務
* @return
* @throws exception
*/public string service()
throws exception})
;/**
* 結果新增到佇列中單執行緒輪詢
*/resultlist.
add(fututre);}
/** * 單執行緒輪詢阻塞結果
* 1000毫秒一次
*/executorservice.
submit
(new
runnable()
thread.
sleep
(1000);
}catch
(interruptedexception e)
catch
(executionexception e)})
;}}}
);}
future用法
future.
isdone()
;//判斷執行緒是否執行完
future.
get();
//獲取結果,如果未執行完則直接阻塞執行緒,很顯然最好isdone判斷一下再呼叫get是最好的
new
threadpoolexecutor.abortpolicy()
;//丟棄任務並丟擲rejectedexecutionexception異常。
newthreadpoolexecutor.discardpolicy()
;//也是丟棄任務,但是不丟擲異常。
newthreadpoolexecutor.discardoldestpolicy()
;//丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
newthreadpoolexecutor.callerrunspolicy()
;//由呼叫執行緒處理該任務
cpu密集任務設計測路(核心執行緒:cpu核數 +1 ):cpu密集型也叫計算密集型,指的是系統的硬碟、記憶體效能相對cpu要好很多,此時,系統運作大部分的狀況是cpu loading 100%,cpu要讀/寫i/o(硬碟/記憶體),i/o在很短的時間就可以完成,而cpu還有許多運算要處理,cpu loading很高。因為這種任務已經跑完加執行緒也沒啥意義,反而導致記憶體增多;
io密集任務設計策略(核心執行緒:cpu核數 * 2):
io密集型指的是系統的cpu效能相對硬碟、記憶體要好很多,此時,系統運作,大部分的狀況是cpu在等i/o (硬碟/記憶體) 的讀/寫操作,此時cpu loading並不高,所以不能讓執行緒閒置,賦予更多的執行緒熟練
大神公式:核心執行緒數 = cpu核數 / (1-阻塞係數) 例如阻塞係數 0.8,cpu核數為4
jvm併發程式設計專題章節:多執行緒框架
多執行緒測試
多執行緒併發程式設計
docker 可謂是開啟了容器化技術的新時代,現在無論大中小公司基本上都對容器化技術有不同程度的嘗試,或是已經進行了大量容器化的改造。伴隨著 kubernetes 和 cloud native 等技術和理念的普及,也大大增加了業務容器化需求。而這一切的推進,不可避免的技術之一便是構建容器映象。在本場...
多執行緒併發程式設計
程序是乙個執行的程式,程序裡面有多個執行緒,執行緒是程序中負責執行的程式的一執行單元,執行緒本身是依靠程式進行執行的,執行緒是程式中乙個順序控制流。執行緒分為單執行緒和多執行緒。多執行緒能更好利用cpu資源。以前單程序的,時間片切換 多執行緒實現方式 繼承thread,實現runnable。exec...
併發程式設計 多執行緒
目錄程序是作業系統可以排程已經進行資源分配的基本單位,是乙個資源單位,其中包含了執行這個程式所需的資源 特點 系統會為每乙個程序自動建立一條執行緒,稱之為主線程,後續通過 開啟的執行緒稱之為子執行緒 計算機是乙個工廠,程序就是乙個車間,執行緒就是車間內的流水線 item 程序執行緒 單位資源單位 執...