Given:
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:
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);
題解
程式第42行,在Worker的建構子用到了cb變數作為引數傳入,所以line n2一定要定義cb變數是什麼東西。
CyclicBarrier是Java內建的類別,位於java.util.concurrent套件下,用來讓某個執行緒等待至指定數量的執行緒呼叫CyclicBarrier的await方法後才繼續執行。
選項A,此種CyclicBarrier物件實體化方式需要呼叫兩次CyclicBarrier的await方法後,await方法之後的程式才會被執行,但是在題目給的程式中,await只有在第11行被呼叫過,因此永遠執行不到第12行,而且也無法執行master這個Runnable物件。
選項B,應該要修改line n2才是正確的。
選項C,此種CyclicBarrier物件實體化方式只需要呼叫一次CyclicBarrier的await方法後,傳入CyclicBarrier建構子的master這個Runnable物件和await方法之後的程式都會被執行,所以這是正確答案。
選項D,CyclicBarrier類別沒有這種建構子。