java執行緒池詳細入門教程即原始碼解析

2021-08-19 21:28:10 字數 3631 閱讀 6212

##1、執行緒池概念

執行緒池是執行緒的集合,通過執行緒池我們不需要自己建立執行緒,將任務提交給執行緒池即可。為什麼要使用執行緒池,首先,使用執行緒池可以重複利用已有的執行緒繼續執行任務,避免執行緒在建立和銷毀時造成的消耗。其次,由於沒有執行緒建立和銷毀時的消耗,可以提高系統響應速度。最後,通過執行緒可以對執行緒進行合理的管理,根據系統的承受能力調整可執行執行緒數量的大小等。

##2、執行緒池使用示例

這裡做兩個測試,首先寫乙個實現runnable介面的類:

class mytask implements runnable

}

main中**:

executorservice pool = executors.newfixedthreadpool(5);

runnable mytask = new mytask();

runnable mytask1 = new mytask();

runnable mytask2 = new mytask();

runnable mytask3 = new mytask();

runnable mytask4 = new mytask();

pool.execute(mytask);

pool.execute(mytask1);

pool.execute(mytask2);

pool.execute(mytask3);

pool.execute(mytask4);

這裡newfixedthreadpool中的5代表可執行執行緒數量。所以結果:

pool-1-thread-3

pool-1-thread-1

pool-1-thread-4

pool-1-thread-5

pool-1-thread-2

可以看到這裡又五個執行緒在執行。這裡如果將可執行執行緒數量變成2,那麼結果如下:

pool-1-thread-2

pool-1-thread-1

pool-1-thread-2

pool-1-thread-1

pool-1-thread-2

可以看到執行緒1和執行緒2都被重複利用了,沒有建立更多的執行緒出來。

##3、執行緒池的狀態

執行緒池的狀態及狀態間的切換如下圖所示:

可以看到執行緒池有五種狀態running,shutdown,stop,tidying,terminated,不同於執行緒的轉台切換的是,執行緒池的狀態可操作的其實只有兩種狀態,running和terminated,執行緒池一旦建立就會處於running狀態,而terminated是終止,執行緒池呼叫shutdown或者shutdownnow執行緒池其實就會慢慢的切換到終止狀態,中間三種狀態只是執行緒由執行態過渡到終止態的中間狀態,用來進行一些處理事項的。running狀態是正常執行狀態,能夠接受新的任務和處理任務,shutdown是關閉狀態,不能接受新的任務,將正在執行的任務處理完畢後進入到tidying整理狀態,stop是停止狀態,不接受任務,也不處理任務,直接中斷任務,然後進入到tidying整理狀態,tidying狀態會自動呼叫terminate方法,呼叫完後進入到終止狀態。

##4、通過原始碼理解執行緒池

首先是執行緒的建立,執行緒的建立一般通過乙個工廠類建立,

executorservice pool = executors.newfixedthreadpool(2);
進去看這個函式:

public static executorservice newfixedthreadpool(int nthreads)
可以看到還是直接new了乙個執行緒池出來,再看這個執行緒池的構造方法:

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

首先對這幾個引數進行說明:

corepoolsize:核心池大小,表示執行緒池正常情況下能執行的執行緒最大多少。

maximumpoolsize:最大池大小,表示執行緒池最大能執行的執行緒數。

keepalivetime:表示執行緒執行任務後的空閒存活時間,過了這個時間執行緒將被銷毀,這個引數的存在也直接實現了概述中所說的前兩點優點,執行緒的消耗可以分為a,b,c三個階段,a代表建立,b代表執行,c代表消耗,如果有很多個任務需要執行時,b執行所帶來的消耗代價小於a,c所帶來的消耗代價,那麼就通過這個引數,讓執行緒保持一段存活時間,方便執行後面的任務。

unit:執行緒空閒存活時間的單位。

workqueue:這個是任務佇列,將後面的任務加入到這個佇列中。

threadfactory:真正用於建立執行緒的引數。

handler:表示已經不能在接收任務時,呼叫的處理類。

在這個構造方法中分別對這幾個引數進行了初始化。**這裡再介紹下這幾個引數的關係,當使用者建立任務時,如果當前的執行的執行緒數小於核心池數量,那麼會建立新的執行緒來執行這個任務,如果當前執行的執行緒數大於核心池的數量,那麼就將任務新增到任務佇列中,如果任務佇列已經裝滿且當前執行執行緒數小於最大池的數量,那麼就再建立執行緒來執行這個任務,如果已經等於了最大池的數量,那麼將拒絕這個任務並且執行handle處理類。**執行緒的建立介紹了再來看任務的執行方法execute:

public void execute(runnable command) 

//如果當前執行執行緒已經超過了核心池大小,並且執行緒池是執行的

//將任務加入到任務佇列中

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

//如果新增佇列失敗了,那麼再建立乙個新的執行緒

else if (!addworker(command, false))

//如果失敗了,也就是最大池滿了,那麼呼叫拒絕的處理方法。

reject(command);

}

這裡多次呼叫到addworker方法,這裡繼續看addworker方法:

private boolean addworker(runnable firsttask, boolean core) 

}//從這裡開始重點看

boolean workerstarted = false;

boolean workeradded = false;

worker w = null;

try

} finally

//worker新增成功執行任務

if (workeradded)

}} finally

return workerstarted;

}

到這裡執行緒池的入門介紹結束。

Java多執行緒入門教程

死亡狀態 dead 執行緒執行完了或者因異常退出了run 方法,該執行緒結束生命週期。修飾普通方法 獲得this物件鎖 synchronized public void synchronized public static void public void 當多個執行緒同時訪問同乙個物件加x鎖的方法...

執行緒池和執行緒詳細教程

執行緒池就是首先建立一些執行緒,它們的集合稱為執行緒池。使用執行緒池可以很好地提高效能,執行緒池在系統啟動時即建立大量空閒的執行緒,程式將乙個任務傳給執行緒池,執行緒池就會啟動一條執行緒來執行這個任務,執行結束以後,該執行緒並不會死亡,而是再次返回執行緒池中成為空閒狀態,等待執行下乙個任務。2.1 ...

GlusterFs入門教程詳細版

本教程將帶領大家一起學習分布式署儲存系統glusterfs,通過本指令碼的學習,您應該可以對glusterfs這門技術有乙個全面的認識和掌握。glusterfs教程鏈結 技多不壓身,希望大家可以學以致用,在未來的工作實踐中能夠很好的應用起來,祝大家學習愉快!好了,接下來,讓我們一起在知識的海洋遨遊吧...