标签:java.util.concurrent cyclicbarrier 同步计数器
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
标签:java.util.concurrent cyclicbarrier 同步计数器
原文地址:http://lizhuquan0769.blog.51cto.com/2591147/1788538