JVM併發程式設計專題 多執行緒管理(執行緒池)

2021-10-06 20:16:16 字數 3786 閱讀 7613

核心執行緒:執行緒在初始化期間建立出來,這樣使用完了扔給下乙個可以重用;開銷少,但會占用記憶體;

臨時執行緒:執行緒用完了就扔掉,每次請求都會新建乙個執行緒;開銷大,但是節約記憶體;

執行緒池分類:週期、臨時、定長;

執行緒池核心:佇列、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 程序執行緒 單位資源單位 執...