因為程序的切換相當耗費資源,加上 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框架為每個程序提供了乙個執行緒池,乙個執行緒池有若干個等待操作狀態,當乙個等待操作完成時,執行緒池中的輔助線程會執行 函式。執行緒池中的執行緒由系統管理,程式設計師不需要費力於執行緒管理...