CyclicBarrier介紹

CyclicBarrier是一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因爲該 barrier 在釋放等待線程後可以重用,所以稱它爲循環 的 barrier。CyclicBarrier 支持一個可選的 Runnable 命令,在一組線程中的最後一個線程到達之後(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作很有用。 


適用場景:

在某種需求中,比如一個大型的任務,常常需要分配好多子任務去執行,只有當所有子任務都執行完成時候,才能執行主任務,這時候就可以選擇CyclicBarrier。


主要方法:

//設置parties、count及barrierCommand屬性。
CyclicBarrier(int):

//當await的數量到達了設定的數量後,首先執行該Runnable對象。
CyclicBarrier(int,Runnable):

//通知barrier已完成線程
await():


示例:

package com.alibaba.concurrent;

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

public class CyclicBarrierTest {

    public static void main(String[] args) {
        final int count = 10;
        // 定義屏障點
        final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {

            public void run() {
                System.out.println("一起去happy.....");
            }
        });

        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {

                public void run() {
                    System.out.println(Thread.currentThread().getName() + ": 到達");
                    try {
                        barrier.await();
                    } catch (InterruptedException e) {
                    } catch (BrokenBarrierException e) {
                    }
                }
            }).start();
        }

    }
}

運行結果:

Thread-0: 到達
Thread-2: 到達
Thread-6: 到達
Thread-3: 到達
Thread-7: 到達
Thread-1: 到達
Thread-4: 到達
Thread-5: 到達
Thread-9: 到達
Thread-8: 到達
一起去happy.....

循環使用:

package com.alibaba.concurrent;

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

public class CyclicBarrierTest {

    public static void main(String[] args) {
        final int count = 10;
        // 定義屏障點
        final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {

            public void run() {
                System.out.println("一起去happy.....");
            }
        });

        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {

                public void run() {
                    System.out.println(Thread.currentThread().getName() + ": 到達");
                    try {
                        barrier.await();
                    } catch (InterruptedException e) {
                    } catch (BrokenBarrierException e) {
                    }
                }
            }).start();
        }
        
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {

                public void run() {
                    System.out.println(Thread.currentThread().getName() + ": 到達");
                    try {
                        barrier.await();
                    } catch (InterruptedException e) {
                    } catch (BrokenBarrierException e) {
                    }
                }
            }).start();
        }

    }
}

運行結果:

Thread-0: 到達
Thread-2: 到達
Thread-1: 到達
Thread-3: 到達
Thread-4: 到達
Thread-8: 到達
Thread-7: 到達
Thread-9: 到達
Thread-5: 到達
Thread-6: 到達
一起去happy.....
Thread-11: 到達
Thread-10: 到達
Thread-12: 到達
Thread-13: 到達
Thread-14: 到達
Thread-15: 到達
Thread-16: 到達
Thread-17: 到達
Thread-18: 到達
Thread-19: 到達
一起去happy.....


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