多執行緒 多執行緒之併發工具類

2021-10-09 02:29:26 字數 3860 閱讀 1706

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 方法後就會被阻塞,這個阻塞點就稱為屏障點...