多線程之CountDownLatch
阿新 • • 發佈:2018-03-24
wait final light current 多線程 tac () brush don
下面請看一個應用場景:
有1個driver和5個worker,需要滿足以下兩點要求:
當driver完成了全部的工作之後才允許worker們開始工作;
當所有的worker都完成了自己的工作之後,driver主線程才能結束。
public class Driver { public static void main(String[] args) throws InterruptedException { CountDownLatch startSignal = new CountDownLatch(1); CountDownLatch doneSignal = new CountDownLatch(5); // 依次創建並啟動5個worker線程 for (int i = 0; i < 5; ++i) { new Thread(new Worker(startSignal, doneSignal)).start(); } System.out.println("Driver is doing something..."); System.out.println("Driver is Finished, start all workers ..."); startSignal.countDown(); // Driver執行完畢,發出開始信號,使所有的worker線程開始執行 doneSignal.await(); // 等待所有的worker線程執行結束 System.out.println("Finished."); } } class Worker implements Runnable{ private final CountDownLatch startSignal; private final CountDownLatch doneSignal; Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { this.startSignal = startSignal; this.doneSignal = doneSignal; } public void run() { try { startSignal.await(); // 等待Driver線程執行完畢,獲得開始信號 System.out.println("Working now ..."); doneSignal.countDown(); // 當前worker執行完畢,釋放一個完成信號 } catch (InterruptedException e) { e.printStackTrace(); } } }
運行結果: Driver is doing something... Driver is Finished, start all workers ... Working now ... Working now ... Working now ... Working now ... Working now ... Finished.
此處修改CountDownLatch個數為一個代碼如下:public class Driver {
public static void main(String[] args) throws Exception { CountDownLatch latch = new CountDownLatch(5); for (int i = 0; i < 5; ++i) { new Thread(new Worker( latch),"t"+i).start(); } latch.await(); System.out.println("結束"); } static class Worker implements Runnable { private final CountDownLatch latch1; public Worker(CountDownLatch latch1) { this.latch1=latch1; } public void run() { System.out.println(Thread.currentThread().getName()+"開始幹活 work"+"id是"+Thread.currentThread().getId()+" "); latch1.countDown(); } } }
結果為:
t4開始幹活 workid是14
t1開始幹活 workid是11
t2開始幹活 workid是12
t3開始幹活 workid是13
t0開始幹活 workid是10
結束
多線程之CountDownLatch