1. 程式人生 > >Java併發之CountDownLatch

Java併發之CountDownLatch

CountDownLatch是一個同步輔助類,可以使用它做一個類似於計數器的功能,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。

典型的應用場景:

  • 有一個任務想要往下執行,但必須要等到其他的任務執行完畢後才可以繼續往下執行。

CountDownLatch類中最重要的三個方法。

public void await() throws InterruptedException { };   //呼叫await()方法的執行緒會被掛起,它會等待直到count值為0才繼續執行   ### 初始值需要等待的事件的數量
public boolean await(long timeout,
TimeUnit unit) throws InterruptedException { }; //和await()類似,只不過等待一定的時間後count值還沒變為0的話就會繼續執行 就是過了超時時間後,就不再掛起等待,而是繼續執行。 public void countDown() { }; //將count值減1 某一個事件在結束

例如:

import java.util.concurrent.CountDownLatch;

public class Test {
    public static void main(String[] args) {
        final CountDownLatch latch =
new CountDownLatch(2); new Thread() { public void run() { try { System.out.println("子任務" + Thread.currentThread().getName() + "正在進行"); Thread.sleep(2000); System.out.println("子任務" + Thread.currentThread().
getName() + "完成"); latch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } ; }.start(); new Thread() { public void run() { try { System.out.println("子任務" + Thread.currentThread().getName() + "正在進行"); Thread.sleep(2000); System.out.println("子任務" + Thread.currentThread().getName() + "完成"); latch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } ; }.start(); try { System.out.println("等待2個子任務完成..."); latch.await(); System.out.println("2個子任務已經完成"); System.out.println("繼續執行當前任務"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } }

允許結果:

等待2個子任務完成...
子任務Thread-0正在進行
子任務Thread-1正在進行
子任務Thread-0完成
子任務Thread-1完成
2個子任務已經完成
繼續執行當前任務