執行緒池相關

2021-09-13 00:05:48 字數 2906 閱讀 8421

介面:executor,executorservice,scheduledexecutorservice

抽象類:abstractexecutorservice

類:threadpoolexecutor,scheduledthreadpoolexecutor

1.分析threadpoolexecutor類

1.是執行緒池的真正實現(包含4個構造方法)

2.分析構造方法需要引數

corepoolsize:核心執行緒數,預設情況下這些執行緒會一直處於存活狀態,即使處於閒置狀態也不會受到keepalivetime限制,如果當前執行緒數小於核心執行緒數,那麼不管有沒有空閒執行緒,都會給新的任務產生新的執行緒

maximumpoolsize:執行緒池能所容納的最大執行緒數,超過這個數執行緒將被阻塞,放到workqueue中,如果當前執行緒數大於核心執行緒數,小於最大執行緒數,如果有空閒執行緒,那麼使用空閒執行緒,如果沒有就建立新的執行緒。 如果當前執行緒數等於最大執行緒數,如果有空閒執行緒,那麼使用空閒執行緒,如果沒有,放入workqueue中

keepalivetime:表示執行緒沒有任務後,保持多久後停止。如果當前執行緒數小於核心執行緒數,那麼這個值沒有意義,如果當前執行緒數大於核心執行緒數,那麼當此執行緒沒有任務該時間後,停止

unit:keepalivetime 的單位

workqueue :乙個阻塞佇列,用來儲存等待執行的任務,當執行緒池中的執行緒數超過它的corepoolsize的時候,執行緒會進入阻塞佇列進行阻塞等待。通過workqueue,執行緒池實現了阻塞功能

workqueue的型別為blockingqueue,通常可以取下面三種型別:

1>有界佇列arrayblockingqueue:基於陣列的先進先出佇列,建立時必須指定大小

2>無界佇列linkedblockingqueue:基於鍊錶的先進先出佇列,建立時不用指定大小,預設int最大值

3>直接提交佇列:synchronousqueue,不會儲存提交的任務,直接建立乙個執行緒執行新來的任務

threadfactory :執行緒工廠,用來建立執行緒。

handler :表示當拒絕處理任務時的策略。當阻塞佇列滿了之後,還有源源不斷的任務過來,此時伺服器忙不過來,需要採取拒絕策略,threadpoolexecutor類中提供了以下四個方法,返回拒絕策略

1>abortpolicy:佇列滿了,丟棄任務丟擲異常(預設的拒絕策略)

2>discardpolicy:佇列滿了,直接丟棄任務,什麼也不幹

3>discardoldestpolicy:佇列滿了,丟棄最早進入佇列的任務,之後嘗試進入佇列

4>callerrunspolicy:佇列滿了,用主線程執行任務,不單獨啟用執行緒

3.如何配置核心執行緒數和最大執行緒數

核心執行緒數:

核心執行緒數,看應用,如果是任務,一天跑一次,設定為0,合適,因為跑完就停掉了,如果是常用執行緒池,看任務量,是保留乙個核心還是幾個核心執行緒數

最大執行緒數:

一般來說如果是cpu密集型:執行緒池大小設定為n+1

如果是io密集型:執行緒池大小設定為2n+1(因為io讀資料或者快取的時候,執行緒等待,此時如果多開執行緒,能有效提高cpu利用率)

最大執行緒數 = (執行緒等待時間+cpu處理時間)/cpu處理時間*cpu數量

什麼是cpu密集型?io密集型?

cpu密集型,也叫計算密集型,主要花費時間在於計算上,對於記憶體,硬碟效率較高

io密集型,cpu較好,或者處理io讀寫操作時間較多,主要花費時間在記憶體,硬碟讀寫上

2.分析executorservice介面

1.執行或者關閉執行緒池中的某個或多個執行緒介面類

包含下列重要方法

1>shutdown方法:關閉執行緒池方法,在關閉執行緒池之前,等待提交的任務完成之後關閉

2>shutdownnow方法:會阻止開啟新任務,並且嘗試停止當前執行的任務,然後關閉執行緒池

3>isshutdown方法:返回執行者是否已經關閉

4>isterminated方法:如果關閉後所有任務都已完成,返回true,只有先呼叫shutdown或shutdownnow方法才返回true

3.分析scheduledexecutorservice介面

1.可排程的執行者服務介面 繼承executorservice

2.包含如下四個方法

1>//指定時延後排程執行任務

public scheduledfuture> schedule(runnable command,

long delay, timeunit unit);

適用於延時單次執行的無返回值任務

2> //指定時延後排程執行任務

public scheduledfutureschedule(callablecallable,

long delay, timeunit unit);

適用於延遲單次執行的有返回值任務

3> //指定時延後開始執行任務,以後每隔period的時長再次執行該任務

public scheduledfuture> scheduleatfixedrate(runnable command,

long initialdelay,

long period,

timeunit unit);

適用於延遲執行無返回值定時任務,延遲後開始,每隔period時間再次執行

4> //指定時延後開始執行任務,以後任務執行完成後等待delay時長,再次執行任務

public scheduledfuture> schedulewithfixeddelay(runnable command,

long initialdelay,

long delay,

timeunit unit);

適用於延遲執行無返回值定時任務,延遲後開始,執行完之後等待delay一段時間後再次執行

多執行緒 執行緒池相關

銀行有四個視窗辦業務,好比四個cpu。如果只開乙個執行緒的話,相當於所有辦業務的人都排成一隊在乙個視窗辦業務,或者說每個人都必須等上乙個人辦完業務之後隨機選乙個視窗,總之就是序列乙個個來。所以這體現了多執行緒優點的就是可以充分利用現在計算機配置多核cpu的硬體特性,把多核cpu利用起來提高任務的處理...

執行緒池面試相關

你們專案中是如何建立執行緒池的呢?new threadpoolexcutor excutorservice service excutors.newfixpoolexcutor n excutorservice service excutors.newcachepoolexcutor excutor...

關於java 執行緒池相關

public class test threadpooltaskexecutor executor new threadpooltaskexecutor 配置核心執行緒數 executor.setcorepoolsize corecount 配置最大執行緒數 executor.setmaxpools...