自定義執行緒池建立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 ...