Java线程并发库之--线程同步工具之CyclicBarrier
CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量。当其中一个线程到达确定点,它会调用await() 方法来等待其他线程。当线程调用这个方法,CyclicBarrier阻塞线程进入休眠直到其他线程到达。当最后一个线程调用CyclicBarrier 类的await() 方法,它唤醒所有等待的线程并继续执行它们的任务。
注意比较CountDownLatch和CyclicBarrier:
1.CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
2.CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
package aliPay; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Cyclibarrier { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService service = Executors.newCachedThreadPool(); final CyclicBarrier cyclibarrier = new CyclicBarrier(3); for (int i = 0; i < 3; i++) { Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { //Thread.sleep((long)(Math.random()*10000)); System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合地点1,当前已有"+ (cyclibarrier.getNumberWaiting()+1)+"个到达"+(cyclibarrier.getNumberWaiting()==2?"都到齐了,继续走吧": "继续等待")); cyclibarrier.await(); //Thread.sleep((long)(Math.random()*10000)); System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合地点2,当前已有"+ (cyclibarrier.getNumberWaiting()+1)+"个到达"+(cyclibarrier.getNumberWaiting()==2?"都到齐了,继续走吧": "继续等待")); cyclibarrier.await(); //Thread.sleep((long)(Math.random()*10000)); System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合地点3,当前已有"+ (cyclibarrier.getNumberWaiting()+1)+"个到达"+(cyclibarrier.getNumberWaiting()==2?"都到齐了,继续走吧": "继续等待")); cyclibarrier.await(); } catch (Exception e) { // TODO: handle exception } } }; service.execute(runnable); } service.shutdown(); } }
划船不用桨、杨帆不等风、一生全靠浪

浙公网安备 33010602011771号