ThreadPool 之 執行緒池概覽

2021-08-04 14:04:15 字數 3174 閱讀 9984

因為程序的切換相當耗費資源,加上 cpu 的發展,作業系統中引入了執行緒的概念。相比於程序的上下文切換,執行緒的切換更輕量級,但是不代表沒有開銷,而且大部分多執行緒的生命週期都比較短,會發生頻繁的執行緒建立、銷毀動作,這也是相當消耗資源的,因此引入了執行緒池。

合理利用執行緒池能夠帶來三個好處。第一:降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。第二:提高響應速度。當任務到達時,任務可以不需要的等到執行緒建立就能立即執行。第三:提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控。

threadpool的實現結構如下圖所示:

threadpoolexecutor是最終的執行緒池實現類,頂層介面是executor,檢視executor原始碼,這個介面中只有乙個方法:

public

inte***ce

executorsource

executorservice介面繼承了executor介面,新增了一些對執行緒池的管理:

public

inte***ce

executorservice

extends

executor

abstractexecutorservice抽象類實現了executorservice介面,對一些方法實現了預設實現。

public

abstract

class

abstractexecutorservice

implements

executorservice

/*** 根據 runnable 構建 runnablefuture

*/protected

runnablefuturenewtaskfor(callablecallable)

/*** 提交任務,從這裡可以看到,內部還是呼叫了 execute 方法

*/public future> submit(runnable task)

/*** 同 submit,只不過構建的是乙個帶有 result 的 futuretask

*/public

futuresubmit(runnable task, t result)

/*** 同上

*/public

futuresubmit(callabletask)

/*** invokeany 內部都呼叫這個方法

* 三個引數,第乙個表示要提交的任務,第二個表示是否是有時間限制的,第三個表示時間

*/private

t doinvokeany(collection extends callable> tasks,

boolean timed, long nanos)

throws interruptedexception, executionexception, timeoutexception

else

if (active == 0)

break;

else

if (timed)

else

f = ecs.take();

}if (f != null) catch (executionexception eex) catch (runtimeexception rex) }}

// 執行到這裡還沒有返回,那麼就丟擲異常

if (ee == null)

ee = new executionexception();

throw ee;

} finally

}// 其他的 invokeany 都是基於 doinvokeany 的,就不貼原始碼了

public

t invokeany(collection extends callable> tasks)

// code......

}public

t invokeany(collection extends callable> tasks, long timeout, timeunit unit)

// code......

}/**

* 執行所有任務,直到所有任務完成或者出現異常才返回

*/public

list> invokeall(collection extends callable> tasks)

throws interruptedexception

for (int i = 0, size = futures.size(); i < size; i++) catch (cancellationexception ignore) catch (executionexception ignore) }}

done = true;

return futures;

} finally

}/**

* 和一般的 invokeall 類似,但是加上了判斷是否在指定時間內執行完畢

* 只要到指定時間,不管任務執行完沒有,都直接返回結果

*/public

list> invokeall(collection extends callable> tasks,

long timeout, timeunit unit)

throws interruptedexception

for (int i = 0; i < size; i++) catch (cancellationexception ignore) catch (executionexception ignore) catch (timeoutexception toe)

nanos = deadline - system.nanotime();}}

done = true;

return futures;

} finally }}

由於貼的**太多,如果所有內容都寫到一篇文章裡太過冗長,因此分開寫了,下篇 threadpool 之執行緒池實現類 threadpoolexecutor 將研究執行緒池的最終實現類threadpoolexecutor

執行緒池 Thread Pool

烽驛2009開源實時通訊平台 原始碼獲取 svn checkouthttp fy2009.googlecode.com svn trunk fy2009 read only 眾所周知,執行緒並非越多越好,理論上乙個cpu 或core 乙個活動執行緒可獲得最佳效能。執行緒池可根據具體硬體的情況 如cp...

ThreadPool(執行緒池)

任務後台基礎 執行緒池。建立執行緒需要時間。如果有不同的短任務要完成,就可以事先建立許多執行緒,在應完成這些任務時發出請求,這個執行緒最好在需要更多的執行緒時增加,在需要釋放資源時減少。不需要自己建立這樣的乙個列表,該錶由threadpool類託管,這個類會在需要時增減池中線程的執行緒數,直到達到最...

ThreadPool 執行緒池

最近在做通訊的專案,裡面需要使用點執行緒池,這裡做下筆記,歡迎指點!執行緒池功能 應用程式可以有多個執行緒,net框架為每個程序提供了乙個執行緒池,乙個執行緒池有若干個等待操作狀態,當乙個等待操作完成時,執行緒池中的輔助線程會執行 函式。執行緒池中的執行緒由系統管理,程式設計師不需要費力於執行緒管理...