栅栏类似于闭锁,它能阻塞一组线程直到某个事件发生。
栅栏与闭锁的关键区别 CyclicBarrier和CountDownLatch的区别
在于,所有线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。
我自己写了几个例子,加上自己的理解总结出几个不同。
1. CyclicBarrier 方法多,可以用reset()方法来重置CyclicBarrier,让栅栏可以反复用。而CountDownLatch如果count变为0了,那么只能保持在这个0的最终状态,不能重新再用。
2. CyclicBarrier 是让一组线程等待某个事件发生,如果发生了,这组线程可以继续执行;CountDownLatch是一个线程或多个线程等待一组线程执行完毕。不同的点就在于当count变为0之后,CyclicBarrier是让这组线程不再阻塞,而继续执行;而CountDownLatch是让等待的线程不阻塞,继续执行。
下面是CyclicBarrier例子。
有三个类。下面是一个开会的例子。首先是组员到达会议室。等到所有组员都到了之后,领导才开始开会。
MeetingLeaderTask: 领导线程。
OpenMeetingTask, 组员线程。
TestOpenMeeting 测试线程
package com.citi.test.mutiplethread.demo5; public class MeetingLeaderTask implements Runnable { @Override public void run() { System.out.println("**********领导开始开会***********"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }