public class CyclicBarrierTest {
public static void main(String[] args) throws Exception {
final CyclicBarrier cyclicBarrier = new CyclicBarrier(11);
new Thread(new Runnable() {
public void run() {
try {
//线程被阻塞,等另外10个线程中的cyclicBarrier.await()都执行导致阻塞了,才11个线程一起释放
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("finish");
}
}).start();
Thread.sleep(2 * 1000);
for (int i = 1; i <= 10; i++) {
final int index = i;
new Thread(new Runnable() {
public void run() {
try {
//线程被阻塞,等另外10个线程中的cyclicBarrier.await()都执行导致阻塞了,才11个线程一起释放
cyclicBarrier.await();
System.out.println("countDown:" + index);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
}
输出:
countDown:10
countDown:3
countDown:1
finish
countDown:7
countDown:5
countDown:4
countDown:8
countDown:2
countDown:6
countDown:9
CountDownLatch与CyclicBarrier对比
1.CountDownLatch是一次性的,用完不能再使用,CyclicBarrier调用reset方法后能重复使用。
2.CountDownLatch是一个线程阻塞,等其他线程执行完countDown方法(该方法不会阻塞线程)后,这个线程才释放;
CyclicBarrier是多个线程一起阻塞,等阻塞的线程数达到设定值,则多个线程一起释放。