執行緒池原理

2021-10-20 19:50:00 字數 3032 閱讀 5849

核心的思想就是把寶貴的資源放到乙個池子中;每次使用都從裡面獲取,用完之後又放回池子供其他人使用。

在jdk 1.5

之後推出了相關的

api,常見的建立執行緒池方式有以下幾種:

executors.newcachedthreadpool()

:無限執行緒池。

executors.newfixedthreadpool(nthreads)

:建立固定大小的執行緒池。

executors.newsinglethreadexecutor()

:建立單個執行緒的執行緒池。

檢視**會發現,其實看這三種方式建立的原始碼就會發現,以上三種都是利用

利用threadpoolexecutor類實現的。

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue)

這幾個核心引數的作用:

corepoolsize

為執行緒池的基本大小。

maximumpoolsize

為執行緒池最大執行緒大小。

keepalivetime

和unit

則是執行緒空閒後的存活時間。

workqueue

用於存放任務的阻塞佇列。

handler

當佇列和最大執行緒池都滿了之後的飽和策略。

通常我們都是使用

:

threadpool.execute(new job());
這樣的方式來提交乙個任務到執行緒池中,所以核心的邏輯就是

execute()

函式了。

在具體分析之前先了解下執行緒池中所定義的狀態,這些狀態都和執行緒的執行密切相關:

private static final int running    = -1 << count_bits;

private static final int shutdown = 0 << count_bits;

private static final int stop = 1 << count_bits;

private static final int tidying = 2 << count_bits;

private static final int terminated = 3 << count_bits;

running

(1)狀態說明:自然是執行狀態,指可以接受任務執行佇列裡的任務執行緒池的初始化狀態是

running

。換句話說,執行緒池被一旦被建立,就處於

running

狀態,並且執行緒池中的任務數為0

(2)狀態切換:執行緒池的初始化狀態是

running

。換句話說,執行緒池被一旦被建立,就處於

running

狀態,並且執行緒池中的任務數為0!

private final atomicinteger ctl = new atomicinteger(ctlof(running, 0));
shutdown

(1)

狀態說明:執行緒池處在

shutdown

狀態時,不接收新任務,但能處理已新增的任務。

(2)

狀態切換:呼叫執行緒池的

shutdown()

介面時,執行緒池由

running -> shutdown。

stop

狀態說明:執行緒池處在

stop

狀態時,不接收新任務,不處理已新增的任務,並且會中斷正在處理的任務。

狀態切換:呼叫執行緒池的

shutdownnow()

介面時,執行緒池由

(running or shutdown ) -> stop

tidying

(1)

狀態說明:當所有的任務已終止,任務數量」為

0,執行緒池會變為

tidying

狀態。當執行緒池變為

tidying

狀態時,會執行鉤子函式

terminated()

。terminated()

在threadpoolexecutor

tidying

時,進行相應的處理;可以通過過載

terminated()

函式來實現。

(2)

狀態切換:當執行緒池在

shutdown

狀態下,阻塞隊列為空並且執行緒池中執行的任務也為空時,就會由

shutdown -> tidying

。當執行緒池在

stop

狀態下,執行緒池中執行的任務為空時,就會由

stop -> tidying。

terminated 

終止狀態,當執行

terminated() 

後會更新為這個狀態。

狀態說明:執行緒池徹底終止,就變成

terminated

狀態。狀態切換:執行緒池處在

tidying

狀態時,執行完

terminated()

之後,就會由

tidying -> terminated

public void execute(runnable command) 

if (isrunning(c) && workqueue.offer(command))

else if (!addworker(command, false)) //如果在第三步的判斷為非執行狀態,嘗試新建執行緒,如果失敗則執行拒絕策略

reject(command);

}

執行緒池1 執行緒池原理

執行緒池可以看做容納執行緒的容器 乙個應用程式最多只能有乙個執行緒池 threadpool靜態類通過queueuserworkitem 方法將工作函式排入執行緒池 每排入乙個工作函式,就相當於請求建立乙個執行緒 執行緒池的作用 執行緒池是為突然大量爆發的執行緒設計的,通過有限的幾個固定執行緒為大量的...

執行緒池原理

一 執行緒池優勢 1.降低資源消耗,通過反覆利用已建立執行緒降低執行緒建立和銷毀造成的消耗 2.提高響應速度,當任務到達時,任務可以不需要等到執行緒的建立就能立即執行 3.提高執行緒的可管理性 二 執行緒池原理 當提交乙個任務時候,執行緒池處理的這麼乙個流程 文字描述 1.執行緒池判斷核心執行緒池是...

執行緒池原理

private static final threadpoolexecutor executor service new threadpoolexecutor 100,120,60,timeunit.seconds,new arrayblockingqueue 1000 new threadfact...