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和...