Ambiq Micro-AMA3B2KK-KBR晶片可穿戴產品解決方案開發之RTC時鐘
阿新 • • 發佈:2022-04-02
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