淺談Java中CyclicBarrier的用法
阿新 • • 發佈:2019-01-08
CyclicBarrier和CountDownLatch一樣,都是關於執行緒的計數器。
用法略有不同,測試程式碼如下:
public class TestCyclicBarrier { private static final int THREAD_NUM = 5; public static class WorkerThread implements Runnable{ CyclicBarrier barrier; public WorkerThread(CyclicBarrier b){ this.barrier = b; } @Override public void run() { // TODO Auto-generated method stub try{ System.out.println("Worker's waiting"); //執行緒在這裡等待,直到所有執行緒都到達barrier。 barrier.await(); System.out.println("ID:"+Thread.currentThread().getId()+" Working"); }catch(Exception e){ e.printStackTrace(); } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() { //當所有執行緒到達barrier時執行 @Override public void run() { // TODO Auto-generated method stub System.out.println("Inside Barrier"); } }); for(int i=0;i<THREAD_NUM;i++){ new Thread(new WorkerThread(cb)).start(); } } } /* 以下是輸出: Worker's waiting Worker's waiting Worker's waiting Worker's waiting Worker's waiting Inside Barrier ID:12 Working ID:8 Working ID:11 Working ID:9 Working ID:10 Working */
- CyclicBarrier初始化時規定一個數目,然後計算呼叫了CyclicBarrier.await()進入等待的執行緒數。當執行緒數達到了這個數目時,所有進入等待狀態的執行緒被喚醒並繼續。
- CyclicBarrier就象它名字的意思一樣,可看成是個障礙, 所有的執行緒必須到齊後才能一起通過這個障礙。
- CyclicBarrier初始時還可帶一個Runnable的引數, 此Runnable任務在CyclicBarrier的數目達到後,所有其它執行緒被喚醒前被執行。