1. 程式人生 > >Java多執行緒---CountDownLatch用法例項

Java多執行緒---CountDownLatch用法例項

java中,除了傳統的wait()、notify()、notifyAll()外,還有一個CountDownLatch類,此法相比上述三個,是程式更加易懂。特別是需要某執行緒需要依賴其他執行緒執行時,可以使用該類。

其中最關鍵的方法是:
countDown(),使得計數器-1;
await() 方法,當計數器不為0時,則呼叫該方法的執行緒阻塞;當計數器為0時,可以喚醒等待的一個或者全部執行緒。

具體程式碼如下:

package com.wayne;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public
class Race { public static void main(String[] args) throws Exception { CountDownLatch runnerPrepareLatch = new CountDownLatch(1); CountDownLatch commanderPrepareLatch = new CountDownLatch(10); CountDownLatch runnerRunLatch = new CountDownLatch(1); CountDownLatch commanderRunlatch = new
CountDownLatch(10); System.out.println("選手們進場"); ExecutorService service = Executors.newCachedThreadPool(); System.out.println("裁判員發出準備指令"); runnerPrepareLatch.countDown(); for(int i = 0;i<10;i++) { final int j = i; service.submit(new
Runnable() { @Override public void run() { System.out.println("運動員"+j+"進行準備"); try { runnerPrepareLatch.await(); Thread.sleep((long)(Math.random()*1000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { System.out.println("運動員"+j+"準備完成"); commanderPrepareLatch.countDown(); } try { runnerRunLatch.await(); long time = (long)(Math.random()*1000); Thread.sleep(time); System.out.println("經歷"+time+"秒"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { commanderRunlatch.countDown(); System.out.println("運動員"+j+"到達終點"); } } }); } commanderPrepareLatch.await(); System.out.println("都準備好,裁判員發出開始指令"); runnerRunLatch.countDown(); commanderRunlatch.await(); System.out.println("比賽結束"); service.shutdown(); } }

輸出結果

選手們進場
裁判員發出準備指令
運動員0進行準備
運動員1進行準備
運動員2進行準備
運動員3進行準備
運動員4進行準備
運動員5進行準備
運動員7進行準備
運動員9進行準備
運動員8進行準備
運動員6進行準備
運動員0準備完成
運動員7準備完成
運動員1準備完成
運動員8準備完成
運動員4準備完成
運動員5準備完成
運動員6準備完成
運動員2準備完成
運動員3準備完成
運動員9準備完成
都準備好,裁判員發出開始指令
經歷41秒
運動員3到達終點
經歷114秒
運動員0到達終點
經歷161秒
運動員5到達終點
經歷278秒
運動員7到達終點
經歷283秒
運動員2到達終點
經歷394秒
運動員4到達終點
經歷414秒
運動員8到達終點
經歷417秒
運動員6到達終點
經歷925秒
運動員9到達終點
經歷963秒
運動員1到達終點
比賽結束