JDK8的Executors建立執行緒池6種方式

2021-10-01 09:01:43 字數 2562 閱讀 7037

先來看看構造方法建立執行緒池threadpoolexecutor的方式

引數含義:

corepoolsize:核心執行緒數,即使執行緒處於空閒狀態也不被銷毀。

maximumpoolsize:執行緒池允許的最大執行緒數。

keepalivetime:當執行緒數大於核心時,這是多餘的空閒執行緒在終止之前等待新任務的最長時間。

unit:keepalivetime的時間單位

workqueue:在執行任務之前用於保留任務的佇列。

defaultthreadfactory:建立新執行緒預設的工廠。

defaulthandler:執行緒池預設拒絕策略(拒絕策略只有在任務數》(佇列數+最大執行緒數)才會執行)

當任務數》(核心執行緒數+佇列數)才會建立新執行緒,但總上限是maximumpoolsize

public

threadpoolexecutor

(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueue

workqueue)

示例手動new方式建立執行緒池

//建立工作佇列存放任務,容量為20

linkedblockingqueue

queue=

newlinkedblockingqueue

<

>(20

);//建立執行緒池

threadpoolexecutor executor=

newthreadpoolexecutor(5

,20,1000l, timeunit.milliseconds,queue)

;

executors.newfixedthreadpool:建立乙個固定長度的執行緒池

public

static executorservice newfixedthreadpool

(int nthreads)

newworkstealingpool:jdk1.8提供的,建立乙個工作竊取執行緒池,它不是threadpoolexecutor的擴充套件,它是新的執行緒池類forkjoinpool的擴充套件,採用多個佇列方式,可以傳入執行緒數,比如a執行緒佇列10個任務,b執行緒佇列5個任務,c執行緒佇列1個任務,c執行緒一般先完成,此時c執行緒會去a執行緒或b執行緒進行任務竊取來執行。能並行操作,適合在耗時任務中使用。

parallelism:官方解釋:目標並行度

public

static executorservice newworkstealingpool

(int parallelism)

newsinglethreadexecutor:單一執行緒的執行緒池,只會使用唯一乙個執行緒來執行任務,即使提交再多的任務,也都是會放到等待佇列裡進行等待 。

public

static executorservice newsinglethreadexecutor()

newcachedthreadpool:建立乙個可以根據需要建立新執行緒的執行緒池,如果有空閒執行緒,優先使用空閒的執行緒

public

static executorservice newcachedthreadpool()

newsinglethreadscheduledexecutor:建立單執行緒能延遲執行、定時執行的執行緒池

public

static scheduledexecutorservice newsinglethreadscheduledexecutor()

newscheduledthreadpool:建立能延遲執行、定時執行的執行緒池

public

static scheduledexecutorservice newscheduledthreadpool

(int corepoolsize)

以上這些方式返回的executorservice是threadpoolexecutor的父介面,實際上內部還是建立的threadpoolexecutor,只是對方法中的引數做了部分初始化而已。

盡量避免使用executor框架建立執行緒池

newfixedthreadpool newsinglethreadexecutor 允許的請求佇列長度為 integer.max_value,可能會堆積大量的請求,從而導致 oom。

newcachedthreadpool newscheduledthreadpool 允許的建立執行緒數量為integer.max_value,可能會建立大量的執行緒,從而導致 oom

newscheduledthreadpool 建立執行緒時用的記憶體並不是我們制定jvm堆記憶體,而是系統的剩餘記憶體。(電腦記憶體-系統其它程式占用的記憶體-已預留的jvm記憶體)

使用建議

建立執行緒池時,核心執行緒數不要過大,過大cpu執行緒上下文切換過多

jdk8學習總結

今天抽點時間對jdk8寫個總體的學習總結,一來當作乙個覆盤加深理解,二來也希望能夠對閱讀的朋友們有一點點幫助,同時也希望大家對文中不準確的內容予以指出。1 函式式介面與lambda表示式 首先說一下函式式介面的概念 介面中的抽象方法如果是重寫了object類的方法的話,是不參與計數的 另外如果乙個介...

JDK8的新特性

這兩天開始看jdk8的新特性,先看了lembda表示式和stream,就乙個感覺,優雅。趕緊將這兩天的成果總結一下 lembda表示式是乙個簡潔 可傳遞的匿名函式,實現了把 塊賦值給乙個變數的功能 格式就是 parameters expression,需要注意的是 引數可以為空 引數為乙個值得時候,...

jdk8的新特性

lambda表示式 格式為 符號左邊為表示式需要的所有引數 符號右邊為表示式要執行的功能 將之前的匿名內部內作為引數傳遞直接可以使用lambda表示式完成 比如lists new arraylist new arraylist stirng public int compare string a,s...