Java併發程式設計的藝術 七 Executors

2021-09-20 02:10:48 字數 1662 閱讀 6245

public static executorservice newcachedthreadpool()

public static executorservice newsinglethreadexecutor()

public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize) 

建立乙個支援定時及週期性的任務執行的執行緒池,多數情況下可用來替代timer類。timer類存在以下缺陷:

// 獲取executorservice例項

executorservice executorservice = executors.newcachedthreadpool();

// 提交任務

executorservice.execute( new runnable()

} );

// 建立執行緒池

executorservice executorservice = executors.newcachedthreadpool();

// 提交任務

future<

string

> future = executorservice.submit( new callable<

string

>

} );

// 獲取執行結果

if ( future.isdone )

// 關閉執行緒池

executorservice.shutdown();

如果future的返回尚未完成,則get()方法會阻塞等待,直到future完成返回,可以通過呼叫isdone()方法判斷future是否完成了返回。

public

threadpoolexecutor (int corepoolsize, int maximumpoolsize, long keepalivetime, timeunit unit,blockingqueueworkqueue)

maximumpoolsize:池中允許的最大執行緒數。

keepalivetime:執行緒池中的空閒執行緒所能持續的最長時間。

unit:持續時間的單位。

workqueue:任務執行前儲存任務的佇列,僅儲存由execute方法提交的runnable任務。

如果執行緒池中的執行緒數量大於等於corepoolsize,但緩衝佇列workqueue未滿,則不再建立新的執行緒,並將新任務放到workqueue中,按照fifo的原則依次等待執行(執行緒池中有執行緒空閒出來後依次將緩衝佇列中的任務交付給空閒的執行緒執行);

如果執行緒池中的執行緒數量大於等於corepoolsize,且緩衝佇列workqueue已滿,但執行緒池中的執行緒數量小於maximumpoolsize,則會建立新的執行緒來處理被新增的任務;

如果執行緒池中的執行緒數量等於了maximumpoolsize,有4種才處理方式(該構造方法呼叫了含有5個引數的構造方法,並將最後乙個構造方法為rejectedexecutionhandler型別,它在處理執行緒溢位時有4種方式,這裡不再細說,要了解的,自己可以閱讀下原始碼)。

另外,當執行緒池中的執行緒數量大於corepoolsize時,如果裡面有執行緒的空閒時間超過了keepalivetime,就將其移除執行緒池,這樣,可以動態地調整執行緒池中線程的數量。

Java併發程式設計的藝術 筆記

併發存在的問題 上下文切換耗時,死鎖,軟硬體資源限制 解決方法 減少上下文切換 1.無鎖併發程式設計 讓不同的執行緒處理不同的資料段 將資料id採用hash演算法分配給不同的執行緒 2.cas演算法 compare and set使用jni 3.使用最少執行緒 減少處於waiting狀態的執行緒 j...

java併發程式設計的藝術(六) AQS

aqs是佇列同步器 abstractqueuesynchronizer 是用來構建鎖和完成其他同步元件的基本框架,再lock裡面,很多的方法都將用到aqs以獲取同步狀態,實現鎖的語義,而不是依靠傳統的synchronized中的物件進行鎖獲取與釋放。aqs的核心思想是基於volatile int s...

Java併發程式設計的藝術 筆記2

現代作業系統排程的最小單位是執行緒,也叫輕量級程序,每個程序可建立多個程序,每個執行緒都有各自的計數器 堆疊和區域性變數等屬性,並且能夠訪問共享變數。處理器在這些執行緒上高速切換,讓使用者感覺到這些執行緒在同時執行。執行緒優先順序 決定執行緒分配處理器資源多少的屬性,設定時,針對頻繁阻塞 休眠或i ...