併發流程工具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個構造方法,如果不需要執行匿名線程,可以只傳入每一次等待的次數

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