先來看看構造方法建立執行緒池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...