java线程并发库学习--CyclicBarrier

java线程并发库学习--CyclicBarrier
public class CyclicBarrier
extends Object
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
以上是jdk文档的说明

     *  现在说说我们今天活动的内容、首先我们要在公司大厅集合、然后参观陈云故居
     *  参观完后集合、准备去淀水湖参观。(有3辆车、对应3个线程)
     * 
     *  我们必须等大家都到齐了才能去下个地方、比如说 、在公司集合、3辆车子都到了才能出发
     *  要不然人装不下啊。这是我们可以用到java线程并发库的CyclicBarrier类
 
public class CyclicBarrierTest {

    public static void main(String[] args) {

        final CyclicBarrier cb = new CyclicBarrier(3);
        //final Semaphore semaphore=new Semaphore(1);

        for (int i = 1; i <= 3; i++) {
      
            new Thread(new Runnable() {

                @Override
                public void run() {
                    try {
                       
                        //semaphore.acquire();
                        System.out.println(Thread.currentThread().getName()
                                + "公司大厅集合");
                        System.out.println(Thread.currentThread().getName()
                                + "公司大厅等待....");
                        //semaphore.release();
                        cb.await();
                        Thread.sleep(2000);
                       
                       
                        //semaphore.acquire();
                        System.out.println(Thread.currentThread().getName()
                                + "陈云故居集合");
                        System.out.println(Thread.currentThread().getName()
                                + "陈云故居等待....");
                        //semaphore.release();
                        cb.await();
                        Thread.sleep(2000);
                       
                       
                        //semaphore.acquire();
                        System.out.println(Thread.currentThread().getName()
                                + "淀水湖集合");
                        System.out.println(Thread.currentThread().getName()
                                + "淀水湖等待....准备回家了");
                        //semaphore.release();
                        cb.await();
                        Thread.sleep(2000);
                       
                       
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }

            }).start();
        }
    }
}
以下是输出结果:
Thread-0公司大厅集合
Thread-0公司大厅等待....
Thread-2公司大厅集合
Thread-1公司大厅集合
Thread-1公司大厅等待....
Thread-2公司大厅等待....
Thread-0陈云故居集合
Thread-1陈云故居集合
Thread-2陈云故居集合
Thread-1陈云故居等待....
Thread-0陈云故居等待....
Thread-2陈云故居等待....
Thread-0淀水湖集合
Thread-2淀水湖集合
Thread-1淀水湖集合
Thread-2淀水湖等待....准备回家了
Thread-0淀水湖等待....准备回家了
Thread-1淀水湖等待....准备回家了

***注意上述代码中的Semaphore类、它也是java线程并发库中的一个类、更多具体作用我们以后再探讨。
以下是使用Semaphore后的输出结果:(相信你已经知道不同的地方了)
Thread-0公司大厅集合
Thread-0公司大厅等待....
Thread-1公司大厅集合
Thread-1公司大厅等待....
Thread-2公司大厅集合
Thread-2公司大厅等待....
Thread-2陈云故居集合
Thread-2陈云故居等待....
Thread-1陈云故居集合
Thread-1陈云故居等待....
Thread-0陈云故居集合
Thread-0陈云故居等待....
Thread-2淀水湖集合
Thread-2淀水湖等待....准备回家了
Thread-1淀水湖集合
Thread-1淀水湖等待....准备回家了
Thread-0淀水湖集合
Thread-0淀水湖等待....准备回家了

http://blog.sina.com.cn/s/blog_7f448c520101219g.html

你可能感兴趣的:(java线程并发库学习--CyclicBarrier)