您的位置:首页 > 编程语言 > Java开发

【Java多线程】同步辅助类CyclicBarrier

2016-06-13 10:08 666 查看
CyclicBarrier是java.util.concurrent包下的一个同步辅助类,类似于CountDownLatch,也是一个同步计数器。

与CountDownLatch不同的区别是:
CountDownLatch的await()方法阻塞的原因是等待调用一定次数的countDown()方法, 可以在同一线程完成;
CyclicBarrier的await()方法阻塞的原因是等待一定数量的线程调用await()方法, 必须在不同线程调用

所以,概括来说:
CountDownLatch是等待一定数量次调用countDown(),否则调用await()方法的线程会阻塞。
CyclicBarrier 是等待一定数量线程调用await(),否则所有调用await()的线程会阻塞。

演示代码:
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestCyclicBarrier {

public static void main(String[] args) {

ExecutorService exec = Executors.newCachedThreadPool();

/**
* 表示必须每5个线程各执行了CyclicBarrier的await()方法, 才会执行CyclicBarrier里的run方法;
* 如果不足5个线程执行await()方法, 那么执行await()方法的线程将会阻塞, 直到第5个线程执行了await()方法;
*/
final CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable(){
public void run()
{
System.out.println("大家都到齐了,开始happy去");
}
});

final Random random=new Random();
for(int i = 0; i < 5; i++)
{
exec.execute(new Runnable(){
public void run()
{
try
{
Thread.sleep(random.nextInt(1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"到了,其他哥们呢");
try
{
//等待剩余的线程执行await()方法;
cyclicBarrier.await();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
catch(BrokenBarrierException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"说: 人齐了, 打球去吧...");
}
});
}
exec.shutdown();
}

}


本文出自 “DeaconLi” 博客,请务必保留此出处http://lizhuquan0769.blog.51cto.com/2591147/1788538
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: