《Java併發程式設計實戰》 7

2021-08-25 08:45:55 字數 1498 閱讀 5438

並非所有的任務有些任務需要明確地指明執行策略,包括:

在一些任務中,需要擁有或排除某種特定的執行策略。如果某些任務依賴於其他的任務,那麼會要求執行緒池足夠大,從而確保它們依賴任務不會被放入等待佇列中或者被拒絕,而採用執行緒封閉機制的任務需要序列執行。通過將這些需求寫入文件,將來的**維護人員就不會由於使用了某種不合適的執行策略而破壞安全性或活躍性。

每當提交了乙個有依賴性的executor任務時,要清楚地知道可能會出現執行緒「飢餓」死鎖,因此需要在**或配置executor的配置檔案中記錄執行緒池的大小限制或配置限制。

如果任務阻塞的時間過長,那麼即使不出現死鎖,執行緒池的響應性也會變得糟糕。

定任務等待資源得時間,而不是無限制地等待可以緩解執行時間較長得任務造成的影響。

一般情況下正確地設定執行緒池的大小(假設有n個cpu):

threadpoolexecutor的通用建構函式

public

threadpoolexecutor(int corepoolsize,

int maximumpollsize,

long keepalivetime,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

基本大小(core poll size)是執行緒池的目標大小,即在沒有任務執行時執行緒池的大小,並且只有在工作佇列滿了的情況下才會建立超過這個數量的執行緒。

執行緒池的最大大小(maximumpoolsize)表示可同時活動的執行緒數量的上限。如果某個執行緒的空閒事件超過了存活時間,那麼將標記為可**,並且當執行緒池的當前大小超過了基本大小時,這個執行緒將被終止。

threadpoolexecutor允許提供乙個blockingqueue來儲存等待執行的任務。基本的任務排隊方法有3種:無界佇列、有界佇列和同步移交(synchronous handoff)。

對於executor,newcachedthreadpool工廠方法時一種很好的預設選擇,他能提供比固定大小的執行緒更好的排隊效能.當需要限制當前任務的數量以滿足資源管理需求時,那麼可以選擇固定大小的執行緒池,就像在接受網路客戶請求的伺服器應用程式中,如果不進行限制,那麼很容易發生過載問題。

每種rejectedexecutionhandler的實現包含有不用的飽和策略:

例項:給執行緒池新增統計資訊

例項:謎題框架

對於併發執行的任務,executor框架是一種強大且靈活的框架。它提供了大量可調節的選項,例如建立執行緒和關閉執行緒的策略,處理佇列任務的策略,處理過多工的策略,並且提供了幾個鉤子方法來擴充套件它的行為。然而,與大多數功能強大的框架一樣,其中有些設定引數並不能很好地工作,某些型別的任務需要特定的執行策略,而一些引數組合則可能產生奇怪的結果。

Java併發程式設計實戰 總結

1.可變狀態是至關重要的。所有的併發問題都可以歸結為如何協調對併發狀態的訪問,可變狀態越少,就越容易確保執行緒安全性。2.盡量將域宣告為final型別,除非需要它們是可變的。3.不可變物件一定是執行緒安全的。不可變物件能極大地降低併發程式設計的複雜性。它們更為簡單而且安全,可以任意共享而無須使用加鎖...

java併發程式設計實戰 簡介

1 併發和並行的區別 併發 多個程式在同一時間段執行,只有乙個cpu。並行 多個程式在同一時刻執行,有多個cpu。2 執行緒帶來的風險 1 安全性問題 永遠不發生糟糕的事情 兩個或多個執行緒同時訪問乙個變數,可能會出現差錯。例如,兩個執行緒同時對乙個變數執行讀操作,從而它們得到了相同的值,違背了該變...

《Java併發程式設計實戰》 5

每當看到new thread runnable start 時,並且你希望獲得一種更靈活的執行策略時,請考慮使用excecutor來代替thread。completionservice將execute和blockingqueue的功能融合在一起。executorcompletionservice實現...