四 執行緒的併發工具類

2022-07-28 01:33:12 字數 3417 閱讀 7837

countdownlatch是什麼?

countdownlatch,英文翻譯為倒計時鎖存器,是乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或多個執行緒一直等待。

閉鎖可以延遲線程的進度直到其到達終止狀態,閉鎖可以用來確保某些活動直到其他活動都完成才繼續執行:

countdownlatch有乙個正數計數器,countdown()方法對計數器做減操作,await()方法等待計數器達到0。所有await的執行緒都會阻塞直到計數器為0或者等待執行緒中斷或者超時。

閉鎖(倒計時鎖)主要用來保證完成某個任務的先決條件滿足。是乙個同步工具類,用來協調多個執行緒之間的同步。這個工具通常用來控制線程等待,它可以讓某乙個執行緒等待直到倒計時結束,再開始執行。

countdownlatch的兩種典型用法

某一線程在開始執行前等待n個執行緒執行完畢。

將 countdownlatch 的計數器初始化為n :new countdownlatch(n),每當乙個任務執行緒執行完畢,就將計數器減1 countdownlatch.countdown(),當計數器的值變為0時,在countdownlatch上 await() 的執行緒就會被喚醒。乙個典型應用場景就是啟動乙個服務時,主線程需要等待多個元件載入完畢,之後再繼續執行。

實現多個執行緒開始執行任務的最大並行性。

注意是並行性,不是併發,強調的是多個執行緒在某一時刻同時開始執行。類似於賽跑,將多個執行緒放到起點,等待發令槍響,然後同時開跑。做法是初始化乙個共享的 countdownlatch 物件,將其計數器初始化為 1 :new countdownlatch(1),多個執行緒在開始執行任務前首先 coundownlatch.await(),當主線程呼叫 countdown() 時,計數器變為0,多個執行緒同時被喚醒。

public class testcountdownlatch 

system.out.println(getname()+"計算結果:"+sum);

countdownlatch.countdown();}}

public static void main(string args) throws interruptedexception

countdownlatch.await();

long end = system.currenttimemillis();

system.out.println("結束了-----"+end);

system.out.println("總共用時:"+(end-begin));

}}/**

開始了-----1571144894551

thread-3計算結果:1000000

thread-0計算結果:1000000

thread-1計算結果:1000000

thread-2計算結果:1000000

thread-4計算結果:1000000

結束了-----1571144894559

總共用時:8

*/

cyclicbarrier是什麼?

​ cyclicbarrier即柵欄類,與countdownlatch類似。它能阻塞一組執行緒直到某個事件的發生。柵欄與閉鎖的關鍵區別在於,所有的執行緒必須同時到達柵字段置,才能繼續執行。

​ cyclicbarrier可以使一定數量的執行緒反覆地在柵字段置處匯集。當執行緒到達柵字段置時將呼叫await方法,這個方法將阻塞直到所有執行緒都到達柵字段置。如果所有執行緒都到達柵字段置,那麼柵欄將開啟,此時所有的執行緒都將被釋放,而柵欄將被重置以便下次使用。

cyclicbarrier構造方法

public cyclicbarrier(int parties) 

public cyclicbarrier(int parties, runnable barrieraction)

cyclicbarrier預設的構造方法是cyclicbarrier(int parties),其引數表示屏障攔截的執行緒數量,每個執行緒使用await()方法告訴cyclicbarrier我已經到達了屏障,然後當前執行緒被阻塞。

cyclicbarrier的另乙個建構函式cyclicbarrier(int parties, runnable barrieraction),用於執行緒到達屏障時,優先執行barrieraction,方便處理更複雜的業務場景。

cyclicbarrier應用示例

public class cyclicbarriertest 

@override

public void run() catch (exception e)

} }public static void main(string args) }}

/**建立工作執行緒0

建立工作執行緒1

thread-0開始等待其他執行緒

建立工作執行緒2

thread-1開始等待其他執行緒

thread-2開始等待其他執行緒

thread-2開始執行

thread-0開始執行

thread-1開始執行

thread-1執行完畢

thread-0執行完畢

thread-2執行完畢

*/

​ 在上述**中,我們自定義的工作執行緒必須要等所有參與執行緒開始之後才可以執行,我們可以使用cyclicbarrier類來幫助我們完成。從程式的執行結果中也可以看出,所有的工作執行緒都執行await()方法之後都到達了柵字段置,然後,3個工作執行緒才開始執行業務處理。

cyclicbarrier和countdownlatch的區別semaphore是什麼?

訊號量(semaphore),又被稱為訊號燈,在多執行緒環境下用於協調各個執行緒, 以保證它們能夠正確、合理的使用公共資源。訊號量維護了乙個許可集,我們在初始化semaphore時需要為這個許可集傳入乙個數量值,該數量值代表同一時間能訪問共享資源的執行緒數量。

semaphore基本用法

執行緒可以通過acquire()方法獲取到乙個許可,然後對共享資源進行操作,注意如果許可集已分配完了,那麼執行緒將進入等待狀態,直到其他執行緒釋放許可才有機會再獲取許可,執行緒釋放乙個許可通過release()方法完成,"許可"將被歸還給semaphore。

semaphore實現互斥鎖

future介面,一般都是取回callable執行的狀態用的。其中的主要方法:

執行緒的併發工具類

countdownlatch 作用 是一組執行緒等待其他的執行緒完成工作以後在執行,加強版join await用來等待,countdown負責計數器的減一 cyclicbarrier 讓一組執行緒達到某個屏障,被阻塞,一直到組內最後乙個執行緒達到屏障時,屏障開放,所有被阻塞的執行緒會繼續執行cycl...

多執行緒併發工具類

一 fork join 什麼是分而治之?規模為n的問題,n 閾值,直接解決,n 閾值,將n分解為k個小規模子問題,子問題互相對立,與原問題形式相同,將子問題的解合併得到原問題的解。fork join使用兩個類來完成以上兩件事情 forkjointask 我們要使用forkjoin框架,必須首先建立乙...

多執行緒併發工具類

countdownlatch,cyclicbarrier,semaphore,exchanger countdownlatch,用於乙個或多個執行緒等待其他執行緒完成操作。構造器中的計數值 count 實際上就是閉鎖需要等待的執行緒數量。這個值只能被設定一次,主線程在啟動其他執行緒後立即呼叫coun...