10 併發工具類cyclicBarrier

2021-08-07 19:11:56 字數 3219 閱讀 9185

cyclicbarrier允許n個執行緒相互等待。

讓一組執行緒到達乙個屏障,只有最後乙個執行緒執行完後,屏障開放,cyclicbarrier指定的執行緒才開始執行,放行條件=執行緒數

countdownlatch區別cyclicbarrier

countdownlatch :執行await()等待其它子執行緒執行完 ,放行條件》= 子執行緒數,也就是說可以有多於count的執行緒對countdownlatch 執行count+1操作,只要countdown次數》=count, awati()就是喚醒;countdown是外部其它工作執行緒扣減

cyclicbarrier:多個執行緒相互等待,放行條件=執行緒數,那麼執行cyclicbarrier指定的執行緒;cyclicbarrier由相互控制

countdownlatch的計數器只能使用一次,而cyclicbarrier的計數器可以使用reset()方法重 置。所以cyclicbarrier能處理更為複雜的業務場景。例如,如果計算發生錯誤,可以重置計數 器,並讓執行緒重新執行一次。

基本使用

//啟動主方法

public

static

void

main

(string[

] args)

else

thread thread=

newthread

(searchers[i]);

thread.

start()

;}system.out.

printf

("main: the main thread has finished.\n");

}

public

class

searcher

implements

runnable

@override

public

void

run(

)try

catch

(interruptedexception e)

catch

(brokenbarrierexception e)

}}

1、構造方法
public

cyclicbarrier

(int parties, runnable barrieraction)

count計數器初始化,表示需要等待count個執行緒執行完

2、等待方法

public

intawait()

throws interruptedexception, brokenbarrierexception

catch

(timeoutexception toe)

}

private

intdowait

(boolean timed,

long nanos)

throws interruptedexception, brokenbarrierexception,

timeoutexception

// 將「count計數器」-1

int index =

--count;

// 如果index=0,則意味著「有parties個執行緒到達barrier」。

if(index ==0)

finally

}// 當前執行緒一直阻塞,直到「有parties個執行緒到達barrier」 或 「當前執行緒被中斷」 或 「超時」這3者之一發生,

// 當前執行緒才繼續執行。

for(;;

)catch

(interruptedexception ie)

else

}// 如果「當前generation已經損壞」,則丟擲異常。

if(g.broken)

throw

newbrokenbarrierexception()

;// 如果「generation已經換代」,則返回index。

if(g != generation)

return index;

// 如果是「超時等待」,並且時間已到,則通過breakbarrier()終止cyclicbarrier,喚醒cyclicbarrier中所有等待執行緒,並丟擲timeoutexception異常

if(timed && nanos <=

0l)}

}finally

}

等待方法,將count計數器-1,判斷if(index==0)表明count個執行緒已經執行完,if action is not null,執行action執行緒

dowait通過lock實現作用就是讓當前執行緒阻塞,直到「有parties個執行緒到達barrier」 或 「當前執行緒被中斷」 或 「超時」這3者之一發生,當前執行緒才繼續執行。

cyclicbarrier是由reentrantlock可重入鎖和condition共同實現的。

cyclicbarrier

構造方法:初始化「必須同時到達barrier的執行緒個數」。

cyclicbarrier dowait方法:當乙個執行緒執行完自己的邏輯後,執行dowait()方法,第一:用lock.lock獲取鎖,將count計數器-1,

如果count不為0,那麼呼叫condition.await()方法阻塞 ,釋放鎖。

當最後乙個執行緒執行到dowait方法將index減到0後,

判斷if(index==0)表明count個執行緒已經執行完,if action is not null,執行action執行緒,喚醒所有condition物件上等待的執行緒,新建乙個generation物件

countdown:

構造方法:初始化計數器個數count個,

wait()方法:自旋 --> 判斷計數器==0, 為0 返回,否則阻塞

countdown方法:計數器減一,喚醒阻塞的執行緒

併發工具類

常用的閉鎖工具類 countdownlatch cyclicbarrier futuretask。閉鎖應用場景 1.有a b c三個執行緒一起執行,可是a執行緒需要等待b c執行緒任務執行完畢才繼續往下執行。2.乙個執行緒的某步計算依賴於其它執行緒的執行結果。用生活例子舉例,小明約小張和小李吃飯,小...

Java併發工具類

目錄 1.等待多執行緒完成的countdownlatch 2.同步屏障cyclicbarrier 3.控制併發執行緒數的semaphore 4.執行緒間交換資料的exchanger countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作,類似於join方法。join的實現原理是不停的...

併發工具類 Exchanger

exchanger是特別容易理解的乙個工具類,它可以在兩個執行緒之間交換資料,只能是2個執行緒,他不支援更多的執行緒之間互換資料。當執行緒1呼叫exchange物件的exchange 方法後,他會陷入阻塞狀態,直到執行緒2也呼叫了exchange 方法,然後以執行緒安全的方式交換資料,之後執行緒a和...