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();

    }

}

 

posted @ 2017-08-02 22:13  十月围城小童鞋  阅读(129)  评论(0)    收藏  举报