多執行緒的基礎使用

2021-10-09 20:37:34 字數 2029 閱讀 4908

不考慮實現原理,直接使用

根據阿里巴巴**規約,

使用執行緒時,更換threadpoolexecutor建立執行緒,用法基本一致。

//建立執行緒

threadpoolexecutor threadpoolexecutor = new threadpoolexecutor(4, 10, 0, timeunit.seconds, new linkedblockingdeque<>(), new threadpoolexecutor.callerrunspolicy());

for()

});}

//結束執行緒

threadpoolexecutor.shutdown();

try catch (interruptedexception e)

引數說明:

1、corepoolsize:核心執行緒數

* 核心執行緒會一直存活,及時沒有任務需要執行

* 當執行緒數小於核心執行緒數時,即使有執行緒空閒,執行緒池也會優先建立新執行緒處理

* 設定allowcorethreadtimeout=true(預設false)時,核心執行緒會超時關閉

2、queuecapacity:任務佇列容量(阻塞佇列)

* 當核心執行緒數達到最大時,新任務會放在佇列中排隊等待執行

3、maxpoolsize:最大執行緒數

* 當執行緒數》=corepoolsize,且任務佇列已滿時。執行緒池會建立新執行緒來處理任務

* 當執行緒數=maxpoolsize,且任務佇列已滿時,執行緒池會拒絕處理任務而丟擲異常

4、 keepalivetime:執行緒空閒時間

* 當執行緒空閒時間達到keepalivetime時,執行緒會退出,直到執行緒數量=corepoolsize

* 如果allowcorethreadtimeout=true,則會直到執行緒數量=0

5、allowcorethreadtimeout:允許核心執行緒超時

6、rejectedexecutionhandler:任務拒絕處理器

* 兩種情況會拒絕處理任務:

- 當執行緒數已經達到maxpoolsize,切佇列已滿,會拒絕新任務

- 當執行緒池被呼叫shutdown()後,會等待執行緒池裡的任務執行完畢,再shutdown。如果在呼叫shutdown()和執行緒池真正shutdown之間提交任務,會拒絕新任務

* 執行緒池會呼叫rejectedexecutionhandler來處理這個任務。如果沒有設定預設是abortpolicy,會丟擲異常

* threadpoolexecutor類有幾個內部實現類來處理這類情況:

- abortpolicy 丟棄任務,拋執行時異常

- callerrunspolicy 執行任務

- discardpolicy 忽視,什麼都不會發生

- discardoldestpolicy 從佇列中踢出最先進入佇列(最後乙個執行)的任務

* 實現rejectedexecutionhandler介面,可自定義處理器

以下多執行緒建立不在推薦使用。

//構造多執行緒,可修改執行緒數

executorservice executorservice = executorbuilder.

create()

.setcorepoolsize(20

).usesynchronousqueue()

.build()

;//使用多執行緒

for()})

;}//如果不方便使用for迴圈,直接多寫幾個executorservice.execute()也是一樣的。

//關閉多執行緒

executorservice.

shutdown()

;try

catch

(interruptedexception e)

多執行緒基礎

對於多執行緒程式設計,很多人概念不清,寫 的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。所以學習多執行緒程式設計最重要的不是學習 api,而是理解什麼才是多執行緒安全的 從例子說起 include include long global1 0 volatile ...

多執行緒基礎

什麼是併發 同時執行多個程式,或者乙個程式的多段 在巨集觀上,存在併發的,但是在微觀上,其實不存在併發 時間片 在計算機中,使用時間片來實現併發的運算 在計算甲中,在最小的單位時間上 只能執行乙個運算 用來控制多個程式之間的輪轉,使得程式交替的執行 達到併發的目的 多個cpu 多個核心 才能實現真正...

多執行緒基礎

多執行緒的最底層依賴於unsafe的compareandswap cas 和locksupport的park和unpark操作。cas需要傳遞兩個引數 expect和update。先跟第乙個引數expect進行比較,如果等於第乙個引數,那麼就將該值設定為第二個引數,這是由硬體提供的原子操作,所以不會...