并发流程工具CyclicBarrier

允许一组线程全部等待彼此达到共同屏障点。 循环阻塞在涉及固定大小的线程的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。这和CountDownLatch有明显的区别。通俗点讲就是:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。

/**
 * 描述:    演示CyclicBarrier,过桥,每一次过五个
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
          int i;
            @Override
            public void run() {
                i++;

                System.out.println("旅游过桥!第"+i+"批次先行");
            }
        });
//        CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
        for (int i = 0; i < 100; i++) {
            new Thread(new Task(i, cyclicBarrier)).start();
        }
    }

    static class Task implements Runnable {
        private int id;
        private CyclicBarrier cyclicBarrier;

        public Task(int id, CyclicBarrier cyclicBarrier) {
            this.id = id;
            this.cyclicBarrier = cyclicBarrier;
        }



        @Override
        public void run() {
            System.out.println("线程" + id + "现在前往集合地点");
            try {
                Thread.sleep((long) (Math.random() * 10000));
                System.out.println("线程" + id + "到了集合地点,开始等待其他人到达");
                cyclicBarrier.await();
                System.out.println("线程" + id + "出发了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述
共100个线程,每五个线程为一批次执行,在执行前会先执行构造方法的匿名线程

此类本身有2个构造方法,如果不需要执行匿名线程,可以只传入每一次等待的次数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章