# CyclicBarrier的用法 ```java= class Worker extends Thread { CyclicBarrier cb; public Worker(CyclicBarrier cb) { this.cb = cb; } public void run() { try { cb.await(); System.out.println("Worker..."); } catch (Exception ex) { } } } class Master implements Runnable { //line n1 public void run() { System.out.println("Master..."); } } ``` and the code fragment: ```java= Master master = new Master(); //line n2 Worker worker = new Worker(cb); worker.start(); ``` You have been asked to ensure that the run methods of both the Worker and Master classes are executed. ### Which modification meets the requirement? A. At line n2, insert CyclicBarrier cb = new CyclicBarrier(2, master); B. Replace line n1 with class Master extends Thread { **C. At line n2, insert CyclicBarrier cb = new CyclicBarrier(1, master);** D. At line n2, insert CyclicBarrier cb = new CyclicBarrier(master); - [x] **Answer:C** - [參考網站](https://magiclen.org/ocpjp-cyclicbarrier/) - [CyclicBarrier的 用法簡單範例](https://my.oschina.net/u/3680947/blog/3025985) :::info CyclicBarrier是Java內建的類別,位於java.util.concurrent套件下,**用來讓某個執行緒等待至指定數量的執行緒呼叫CyclicBarrier的await方法後才繼續執行** --- **CyclicBarrier cb = new CyclicBarrier(count, runnable);** --- - 選項A,此種CyclicBarrier物件實體化方式需要呼叫兩次CyclicBarrier的await方法後,await方法之後的程式才會被執行,但是在題目給的程式中,await只有在第11行被呼叫過,因此永遠執行不到第12行,而且也無法執行master這個Runnable物件。 - 選項B,應該要修改line n2才是正確的。 - 選項C,此種CyclicBarrier物件實體化方式只需要呼叫一次CyclicBarrier的await方法後,傳入CyclicBarrier建構子的master這個Runnable物件和await方法之後的程式都會被執行,所以這是正確答案。 - 選項D,CyclicBarrier類別沒有這種建構子。 ::: ###### tags: `ocpjp`