1. 程式人生 > >CountDownLatch控制多個執行緒的執行

CountDownLatch控制多個執行緒的執行

需求:多個執行緒同時工作,然後其中幾個執行緒可以隨意併發,但是有一個執行緒要等待之前幾個執行緒併發執行的結果,才能開始執行, 舉例:開啟多個執行緒下載一個檔案,每個執行緒固定下載一段,最後由一個執行緒來拼接之前的執行緒下載的結果,那麼這個時候我們就可以使用CountDownLatch來實現以上的需求。

CountDownLatch 是Concurrent包中的一個輔助類,可以把他看成是一個計數器,其內部維護著一個count計數,只不過這個計數器的操作都是原子操作,同時只能有一個執行緒去操作這個計數器,CountDownLatch通過建構函式傳入一個初始計數值,呼叫者可以通過呼叫CountDownLatc物件的cutDown()方法來使計數器減1,如果呼叫者呼叫物件上的await()方法,那麼呼叫者就會一直阻塞在這裡,直到其他執行緒呼叫cutDown()來使計數器值為0,才可以繼續執行

CountDownLatch和join方法很類似:

Thread中,join()方法的作用是呼叫執行緒等待該執行緒完成後,才能繼續用下執行。

public static void main(String[] args) throws InterruptedException { System.out.println("main start");

Thread t1 = new Thread(new Worker("thread-1"));
    Thread t2 = new Thread(new Worker("thread-2"));
    t1.start();
    //等待t1結束,這時候t2執行緒並未啟動
    t1.join();
    
    //t1結束後,啟動t2執行緒
    t2.start();
    //等待t2結束
    t2.join();

    System.out.println("main end");
}

例如:

public class TestCountDownLatch {

public static void main(String[] args) throws Exception{
	CountDownLatch countDownLatch=new CountDownLatch(2);
	
	new Thread(new Runnable() {
		
		@Override
		public void run() {
			for(int i=0;i<20;i++){
				System.out.println("哈哈---》"+i);
			}
			countDownLatch.countDown(); //計數器減一
			
			
		}
	}).start();
	
	new Thread(new Runnable() {
		
		@Override
		public void run() {
			for(int i=0;i<20;i++){
				System.out.println("嘿嘿---》"+i);
			}
			
			countDownLatch.countDown();//計數器減一
		}
	}).start();
	countDownLatch.await();  //如果計數器不為0 那麼就阻塞主執行緒,如果計數器為0,那麼主執行緒繼續執行
	
	System.out.println("羅鑫是SB");
}

}