1. 程式人生 > >多線程之CountDownLatch

多線程之CountDownLatch

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