1. 程式人生 > 其它 >Ambiq Micro-AMA3B2KK-KBR晶片可穿戴產品解決方案開發之RTC時鐘

Ambiq Micro-AMA3B2KK-KBR晶片可穿戴產品解決方案開發之RTC時鐘

CyclicBarrier,通過設定屏障的方式使得多執行緒同步,能夠控制多個執行緒在屏障處等等其他執行緒也執行到屏障點,可以實現CountDownLatch具有的功能,但是比CountDownLatch功能強大;

 

CyclicBarrier即同步屏障,它主要功能是讓一組執行緒達到一個屏障(也可以稱為同步點)是被阻塞,直到最後一個執行緒達到屏障時,屏障才被開啟,所有被攔截的執行緒才會繼續執行。

其建構函式預設也是接收一個int型別的引數N作為屏障攔截的執行緒數量,每個執行緒呼叫await方法表示到達了屏障點,然後被阻塞。

具體示例如下:

public class CyclicBarrierTest {


    // 引數表示屏障攔截的執行緒數量, 每個執行緒呼叫 await方法,告訴CyclicBarrier我已經到達了屏障,然後當前執行緒被阻塞
    // 屏障攔截的執行緒數量必須和當前的執行緒數一致,並且都呼叫await方法,否則當前所有的執行緒都處於等待狀態
    static CyclicBarrier c = new CyclicBarrier(3);
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("1---1 " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
                    c.await();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("1---2 " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
            }

        }).start();


        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("2---1 " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
                try {
                    c.await();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("2---2 " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
            }
        }).start();


        SleepUtils.second(2);
        System.out.println("3---1 " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
        try {
            c.await();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("3---2 " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
    }


}

輸出結果如下:

2---1 10:03:30
1---1 10:03:30
3---1 10:03:32
1---2 10:03:32
2---2 10:03:32
3---2 10:03:32

  

注意點
1、建構函式中的N必須為執行緒的總數,當最後一個執行緒呼叫await方法(到達屏障)時,屏障才會開啟,被阻塞的執行緒才會執行,這裡的N表示的含義和CountDownLatch傳入的N是不一樣的。
2、我們發現,當所有執行緒都到達屏障時,當屏障開啟,接下來會優先執行哪個執行緒呢?如上程式碼答案是不確定的。但是CyclicBarrier為我們提供了一個更高階的用法,即建構函式還支援傳遞一個Runnable物件,當屏障開啟時,優先執行Runnable中的run方法。(這一功能十分強大,完全可以替代CountDownLatch了)

應用場景
同CountDownLatch
與CountDownLatch區別:
CountDownLatch計數器只能使用一次,而CyclicBarrier的計數器可以使用 reset方法重置,所以適合更復雜的業務場景。

 

參考: https://blog.csdn.net/qq_27828675/article/details/114068266