自定義執行緒池

2021-10-10 10:59:45 字數 2778 閱讀 5414

自定義執行緒池建立api

執行緒池建立通過juc的介面 executor 實現, 平時我們使用其實現類 threadpoolexecutor 實現自定義執行緒池。

常用建構函式:

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

引數詳解corepoolsize:核心執行緒數。

maximumpoolsize:最大執行緒數

keepalivetime:空閒最大存活時間

unit:存活時間單位

workqueue:任務快取佇列

threadfactory:執行緒工廠類

handler:拒絕策略

執行緒池建立執行緒的規則:預設情況下,執行緒池建立時啟動的執行緒為0,當任務執行時建立執行緒來執行任務,併發任務時,首先建立的執行緒數為設定的corepoolsize ,多餘的任務存到workqueue 佇列中,如果佇列滿了之後,且設定的maximumpoolsize 大於corepoolsize ,則會建立新的執行緒執行任務,對於大於corepoolsize 數量的執行緒,再空閒keepalivetime 時間後會銷毀執行緒。如果建立的執行緒達到maximumpoolsize 還有併發任務等待,則會執行 設定的拒絕策略。

這裡有個點需要注意:只有佇列滿了之後才會建立新的執行緒數量至maximumpoolsize ,和執行拒絕策略,所以如果佇列的大小必須是有界佇列,這也是不使用 executors 預設五種api建立執行緒池的原因。

自定義執行緒池建立demo

private static threadpoolexecutor threadpoolexecutor = new threadpoolexecutor(10,16,10, timeunit.minutes, new arrayblockingqueue<>(400),

executors.defaultthreadfactory(),new threadpoolexecutor.abortpolicy());

這裡設定的核心執行緒池10,最大執行緒池16,空閒執行緒時間10分鐘,佇列大小為400,預設工廠,丟擲異常策略建立。

佇列選擇執行緒工廠類

執行緒工廠類顧名思義指定執行緒建立過程,預設的執行緒建立原始碼為:

static class defaultthreadfactory implements threadfactory 

public thread newthread(runnable r)

}

主要是實現 threadfactory 實現 newthread 來指定建立執行緒的過程 ,從原始碼中我們可以看出,指定執行緒為使用者執行緒(非守護執行緒),設定優先順序為預設優先順序。 使用 thread的建構函式建立thread物件。thread的建構函式這裡不展開介紹

我們也可以自定義乙個執行緒工廠類,例:

public class namethreadfactory implements threadfactory 

}

這裡使用最簡單方式演示,當然我們也可以使用類似預設執行緒池工廠類類似,指定名稱,執行緒組更多屬性。

拒絕策略

當執行緒池的任務快取佇列已滿,且執行緒池的執行緒資料達到maximumpoolsize 時,如果還會任務來到就會採用配置的拒絕策略,拒絕策略實現 rejectedexecutionhandler 介面,通過檢視類結構可以看到執行緒池提供拒絕策略常用的有以下:

threadpoolexecutor.abortpolicy :丟棄任務併發丟擲 rejectedexecutionexception 異常 ;

threadpoolexecutor.discardpolicy : 丟棄任務但是不丟擲異常

threadpoolexecutor.discardoldestpolicy:丟棄佇列最前面的任務,然後重新提交被拒絕的任務

threadpoolexecutor.callerrunspolicy:由呼叫執行緒處理改任務

執行緒池簡單使用

/**

* 非同步傳送訊息

** @param msgreq

* @return

*/public static boolean sendmsgasync(msgreq msgreq) );

return true;

}

自定義執行緒池

有些時候 jdk自帶的cachedthreadpool fixedthreadpool等執行緒池完成不了我們業務的需求時 可以用threadpoolexecutorg構造自定義的執行緒池。public class usethreadpoolexecutor1 這段 會首先執行任務1,然後把2 3 4...

自定義執行緒池

建立執行緒池方法 儘管executors提供了四種執行緒池建立的方式,但為了實現某些特定的需求,可以自己建立執行緒池。如在阿里的程式設計規範使用executors建立執行緒時,一般會報錯,並提示以下資訊 執行緒池不允許使用executors去建立,而是通過threadpoolexecutor的方式,...

自定義執行緒池

版本一 usr bin env python coding utf 8 import queue import threading class threadpool object def init self,max num 20 self.queue queue.queue max num for ...