Java Executor執行緒池

2021-09-22 17:49:13 字數 2725 閱讀 9971

什麼是執行緒池?

將若干執行緒放在一起,同一進行管理,排程,和監控(執行緒池就相當於 包工頭)

為什麼要有執行緒池?

執行緒池有如下的優點:

1.降低資源消耗:重複利用已有的執行緒,減少了不斷建立銷毀執行緒的資源消耗

2.提高響應速度:在任務到達時,不需要等待執行緒的建立就可以直接執行任務

3.便於管理:使用執行緒池可以統一進行執行緒的分配、排程管理

執行緒池構造方法的幾個引數幾個引數:

corepoolsize:核心執行緒池數

maximumpoolsize:最大執行緒池數

keepalivetime:最大等待時間

blockingqueue:工作佇列

四種:arrayblockingqueue:底層用陣列實現是乙個fifo佇列

​ linkedblockingqueue:底層用鍊錶實現fifo,是乙個無界限佇列,吞吐量較大

​ synchronousqueue:是乙個不儲存元素的無界佇列,意思是,每個插入操作必須等待另乙個執行緒的移除操 作,吞吐量比linkedblocking大

​ priorityblockingqueue:乙個有優先順序的無限阻塞佇列

rejectedexecutionhandler:處理策略

四種:abortpolicy(預設的處理策略,直接丟擲異常)

​ callerrunspolicy(讓呼叫其的執行緒執行)

​ discardoldestpolicy(丟棄執行緒池裡最近的乙個任務)

​ discardpolicy(不處理直接丟棄,也不會受到異常資訊)

執行緒池的執行流程:

1.向執行緒池裡新增任務,如果核心執行緒池沒滿,直接新增到核心執行緒池裡執行任務;如果核心執行緒池滿了,看核心執行緒池是否由空閒的執行緒,否則執行步驟2,

2.將任務封裝成work新增到工作佇列中,如果工作佇列沒滿,直接新增,如果滿了執行步驟3

3.判斷執行緒池的執行緒是否都處於工作狀態,如果沒有,建立乙個新的工作執行緒,否則如果以滿,執行飽和策略處理該任務。

執行緒池的建立

public

threadpoolexecutor

(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueue

workqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

這種建立執行緒池的方式,最大執行緒池數沒有用,因為是乙個linkedblickingqueue的無界佇列。

class

mythread

implements

runnable

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+"end....");

}}public

class

test

task.

shutdown()

;}}

2.單執行緒池:newsingleexecutor();

使用場景:用於保證順序的執行任務,並且在每個場景下只有單執行緒

public

static executorservice newsinglethreadexecutor()

工作佇列還是乙個無界佇列,但是,執行緒數只有1,每次只會執行乙個任務

public

class

test

task.

shutdown()

;}}

3.快取執行緒池:newcatachthreadpool()

使用場景:根據需要建立執行緒的執行緒池,適合一些任務多,但業務邏輯簡單的場景

public

static executorservice newcachedthreadpool()

工作佇列是乙個synchronousqueue每插入乙個元素,就會被執行緒池取走,如果60秒執行緒沒有執行任務 終止。

1.如果提交任務速度高於任務處理速度,那麼,執行緒將會不斷被建立(資源消耗大)。

2.反之,已有執行緒的復用率高。

public

class

test

task.

shutdown()

;}}

4.newschedulethreadpool和time功能類似(但後者是延期排程單執行緒的)

提交任務的方法 scheduleatfixedrate() 週期性排程 和schedulewithfixeddelay()

class

mythread

implements

runnable

}public

class

test

//注意,這裡沒有關閉執行緒池,如果關閉,那麼乙個執行緒也不會執行

}}

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...

mysql 執行緒池 c MySQL執行緒池

mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...