jdk 1.5 後,為我們提供的併發工具類有:
名稱描述詳細
countdownlatch同步計數器
初始化時,傳入需要計數的執行緒等待數,並用 await() 阻塞當前執行緒,其他執行緒中可以呼叫 countdown()方法讓計數器減一,當計數器為 0 時,則放行
cyclicbarrier柵欄
讓一組執行緒達到某個屏障被阻塞,一直到組內最後乙個執行緒達到屏障時,屏障開放,所有被阻塞的執行緒才會繼續執行
semaphore訊號量/令牌桶
類似於令牌桶演算法,通過控制令牌數量,讓持有令牌的執行緒執行,未持有的等待,實現多執行緒的併發控制,常用於流量控制
exchange兩個執行緒的資料交換器
通過在兩個執行緒中定義同步點,當兩個執行緒都到達同步點時,交換資料結構
●概念
countdownlatch 是乙個同步計數器,初始化時,傳入需要計數的執行緒等待數,並用 await() 阻塞當前執行緒,其他執行緒中可以呼叫 countdown()方法讓計數器減一,當計數器為 0 時,則放行。
●作用
用來協調多個執行緒之間的同步,是一組執行緒等待其他的執行緒完成工作以後在執行,相當於加強版join。例如a執行緒的繼續執行需要依賴於執行緒b、c、d都執行完成,a才能繼續處理的情況
●關鍵方法
方法作用
wait()
用於阻塞當前執行緒,等待計數器計數值減到0
countdown()
將計數器減一
●示例**
public class countdownlatchdemo
}public static void main(string args)
try catch (interruptedexception e) }}
●概念cyclicbarrier 可以讓一組執行緒達到某個屏障被阻塞,一直到組內最後乙個執行緒達到屏障時,屏障開放,所有被阻塞的執行緒才會繼續執行
●作用
協調多執行緒的同步,讓多個執行緒阻塞在柵欄處,直到相關執行緒都到了柵欄才會一起放行
●關鍵方法
方法作用
await()
用於阻塞當前執行緒,等待所有執行緒都到達屏障
●示例**
public class cyclicbarrierdemo
}private static class subthread extends thread catch (interruptedexception e) catch (brokenbarrierexception e) }}
public static void main(string args)
try catch (interruptedexception | brokenbarrierexception e)
system.out.println("主線程完成");}}
●概念通過定義令牌數量,讓執行緒進行獲取和歸還,控制一定時間內的執行緒通過數量
●作用
削峰,控制同一時間執行的執行緒數量,避免高峰期占用太多執行緒資源
●關鍵方法
方法作用
acquire()
獲取令牌
release()
釋放令牌
●示例**
public class testsemphore
}public static void main(string args)
}}class connectbean
public void dosomething() catch (interruptedexception e)
}}class semaphorepool
/*** 初始化執行緒池
*/static
}public connectbean getconnect()
} catch (interruptedexception e)
return connectbean;
}public void releaseconnect(connectbean connectbean)
// 釋放令牌
canuse.release();}}
}
●概念通過在兩個執行緒中定義同步點,當兩個執行緒都到達同步點時,交換資料結構
●作用
兩個執行緒之間實現資料互動
●關鍵方法方法
作用exchange(v x)
互動資料,若只有乙個執行緒到達同步點,則會等待
●示例**
public class exchangerdemo
@override
public void run() catch (interruptedexception e) }}
private static class exchangerclasst extends thread
@override
public void run() catch (interruptedexception e) }}
private static void exchange(setset) throws interruptedexception
exchanger.exchange(set);
system.out.println("執行緒:" + thread.currentthread().getname() + "交換後得值....");
for (string s : set)
}public static void main(string args)
}
countdownlatchcyclicbarrier等待執行緒數目乙個執行緒等待,直到其他執行緒都完成且呼叫 countdown(),才繼續執行
所有執行緒都等待,直到所有執行緒都準備好進入 await()後,全部放行
使用次數只能使用一次
可以呼叫 reset() 方法重置,能處理更為複雜的業務場景,比如如果計算發生錯誤,可以重置計數器,並讓執行緒們重新執行一次
拓展性
提供其他有用的方法,比如getnumberwaiting方法可以獲得cyclicbarrier阻塞的執行緒數量。isbroken方法用來知道阻塞的執行緒是否被中斷。如果被中斷返回true,否則返回false
多執行緒併發工具類
一 fork join 什麼是分而治之?規模為n的問題,n 閾值,直接解決,n 閾值,將n分解為k個小規模子問題,子問題互相對立,與原問題形式相同,將子問題的解合併得到原問題的解。fork join使用兩個類來完成以上兩件事情 forkjointask 我們要使用forkjoin框架,必須首先建立乙...
多執行緒併發工具類
countdownlatch,cyclicbarrier,semaphore,exchanger countdownlatch,用於乙個或多個執行緒等待其他執行緒完成操作。構造器中的計數值 count 實際上就是閉鎖需要等待的執行緒數量。這個值只能被設定一次,主線程在啟動其他執行緒後立即呼叫coun...
多執行緒 併發工具類之CyclicBarrier詳解
從字面意思理解,cyclicbarrier是回環屏障的意思,它可以讓一組執行緒全部達到乙個狀態後再全部同時執行。這裡之所以叫作回環是因為當所有等待執行緒執行完畢,並重置cyclicbarrier 的狀態後它可以被重用。之所以叫作屏障是因為執行緒呼叫await 方法後就會被阻塞,這個阻塞點就稱為屏障點...