Java中关于CyclicBarrier的使用

CyclicBarrier工具类主要是控制多个线程的一起执行,CyclicBarrier 实例可以多次使用。

演示程序:

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 
 * CyclicBarrier和CountDownLatch功能类似,都可以用作在所有线程都做好准备(比如赛跑:
 * 每一个运动员可以认为是一个线程,只有当所有运动员做好准备才能鸣枪开始跑)之后一起触发运行。 <br>
 * <br>
 * 但是也有区别:<br>
 * 1:CountDownLatch(初始值为线程个数)需要每当一个线程准备好之后,调用一下countDown方法,告诉CountDownLatch又有一个线程已经完成准备,当CountDownLatch值为0时候则触发所有线程一起执行<br>
 * 2:CyclicBarrier(初始值为线程个数)需要每当一个线程准备好之后运行时候会阻塞在await处,当所有线程都阻塞在await处时候,即可触发所有线程执行。(CyclicBarrier:可以循环使用,每当触发完毕一次之后还可以
 * 再次使用该CyclicBarrier的实例对象)
 */
public class CyclicBarrierDemo {

    public static void main(String[] args) throws Exception {
        /**
         * 重复使用的CyclicBarrier对象实例
         */
        CyclicBarrier c = new CyclicBarrier(3);
        
        startThread(c); //第一次使用CyclicBarrier示例
        Thread.sleep(5 * 1000);
        startThread(c);
        Thread.sleep(5 * 1000);
        startThread(c);

    }

    /**
     * 
     * @param c 重复使用的CyclicBarrier对象实例
     */
    public static void startThread(CyclicBarrier c) {
        
        Thread t1 = newThread("t1", c);
        Thread t2 = newThread("t2", c);
        Thread t3 = newThread("t3", c);
        t1.start();
        t2.start();
        t3.start();
    }

    public static Thread newThread(final String threadName, final CyclicBarrier c) {

        return new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    int time = new Random().nextInt(3);
                    System.out.println(threadName + " sleep " + time + "秒 。");
                    Thread.sleep(time * 1000);
                    c.await(); //当所有线程都阻塞在此处时候触发所有线程执行
                    System.out.println(threadName + " is running .");
                } catch (InterruptedException | BrokenBarrierException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }, threadName);
    }

}

 

posted @ 2017-10-11 22:14  bf378  阅读(168)  评论(0编辑  收藏  举报