CyclicBarrier 是一個(gè)同步輔助類(lèi),它允許一組線程相互等待,直到所有線程都到達(dá)某個(gè)柵欄狀態(tài)再同時(shí)執(zhí)行。CyclicBarrier 可以用于多線程計(jì)算數(shù)據(jù),最后合并計(jì)算結(jié)果的場(chǎng)景。
CyclicBarrier 可以理解為一個(gè)計(jì)數(shù)器,通過(guò)構(gòu)造函數(shù)指定計(jì)數(shù)器的初始值,每個(gè)線程在到達(dá)柵欄時(shí)通過(guò)調(diào)用 await() 方法將自己計(jì)數(shù),計(jì)數(shù)器的值減1,直到所有線程都到達(dá)柵欄,計(jì)數(shù)器的值為0,此時(shí)所有線程同時(shí)被釋放,并且柵欄被重置,可以重新使用。
CyclicBarrier 的主要方法包括:
await(): 在柵欄上等待,直到所有線程都到達(dá)柵欄。每個(gè)線程調(diào)用該方法都會(huì)導(dǎo)致計(jì)數(shù)器減1,當(dāng)計(jì)數(shù)器減到0時(shí),所有線程同時(shí)被釋放。
await(long timeout, TimeUnit unit): 在指定的超時(shí)時(shí)間內(nèi)等待,如果超過(guò)指定時(shí)間仍然有線程未到達(dá)柵欄,則拋出 TimeoutException 異常。
CyclicBarrier 的使用步驟如下:
創(chuàng)建 CyclicBarrier 實(shí)例,指定計(jì)數(shù)器的初始值和到達(dá)柵欄時(shí)要執(zhí)行的動(dòng)作。
在每個(gè)線程中,調(diào)用 await() 方法等待其他線程到達(dá)柵欄。
當(dāng)所有線程都到達(dá)柵欄后,執(zhí)行指定的動(dòng)作。
重復(fù)使用 CyclicBarrier,可以通過(guò)重新創(chuàng)建一個(gè)新的實(shí)例來(lái)實(shí)現(xiàn)。