java.util.concurrent.CyClicBarrierClass是線程的一種同步機制法焰。它相當于一個柵欄,所有線程必須等待倔毙,直到指定數(shù)量線程到達埃仪。線程才能繼續(xù)執(zhí)行下去。
當線程調(diào)用Cyclicarrier.await方法時陕赃,線程將等待卵蛉。如果指定數(shù)量的線程調(diào)用此方法颁股,所有的線程將會釋放,然后線程繼續(xù)執(zhí)行傻丝。
創(chuàng)建 CyclicBarrier
當創(chuàng)建一個CyclicBarrier時甘有,你要指定等待線程的數(shù)量N。只有當N個線程等待時(call ?await())葡缰,所有線程才會釋放梧疲。
CyclicBarrier barrier = new CyclicBarrier(2);
線程等待
barrier.await();
你也可以指定一個超時時間。線程將會釋放运准,當超時時間到達時。無論是否有N個線程到達缭受。
barrier.await(10, TimeUnit.SECONDS);
等待線程被釋放的幾個條件
1胁澳,最后的一個線程到達(calls await() )
2,線程被其他線程中斷 (another thread calls its interrupt() method)
3米者,等待的其他線程被中斷(Another waiting thread is interrupted)
4韭畸,其中一個等待線程超時時間到(Another waiting thread times out while waiting at theCyclicBarrier)
5,CyclicBarrier被重置(TheCyclicBarrier.reset())
CyclicBarrier 行為
當構(gòu)造CyclicBarrier時蔓搞,你可以指定一個Runnable對象胰丁。一旦最后一個線程到達,那么該Runnable將被執(zhí)行喂分。
Runnable? ? ? barrierAction = ... ;
CyclicBarrier barrier? ? ? = new CyclicBarrier(2, barrierAction);
CyclicBarrier示例
下面是程序執(zhí)行結(jié)果
Thread-0 waiting at barrier 1
Thread-1 waiting at barrier 1
BarrierAction 1 executed
Thread-0 waiting at barrier 2
Thread-1 waiting at barrier 2
BarrierAction 2 executed
Thread-1 done!
Thread-0 done!