CountDownLatch

CountDownLatch

允許一個或多個執行緒等待直到在其他執行緒中執行的一組操作完成的同步輔助。

  1. 使用給定計數初始化 CountDownLatch
  2. 由於 countDown() 方法的呼叫,await 方法阻塞直到當前計數達到零,之後所有等待的執行緒被釋放,並且等待的任何後續呼叫立即返回。
  3. 這是一次性現象 - 計數無法重置。如果你需要重置計數的版本,請考慮使用 CyclicBarrier

關鍵方法:

public void await() throws InterruptedException

除非執行緒被中斷,否則導致當前執行緒等待鎖存器倒計數到零。

public void countDown()

減少鎖存器的計數,如果計數達到零則釋放所有等待的執行緒。

例:

import java.util.concurrent.*;

class DoSomethingInAThread implements Runnable {
    CountDownLatch latch;
    public DoSomethingInAThread(CountDownLatch latch) {
        this.latch = latch;
    } 
    public void run() {
        try {
            System.out.println("Do some thing");
            latch.countDown();
        } catch(Exception err) {
            err.printStackTrace();
        }
    }
}

public class CountDownLatchDemo {
    public static void main(String[] args) {
        try {
            int numberOfThreads = 5;
            if (args.length < 1) {
                System.out.println("Usage: java CountDownLatchDemo numberOfThreads");
                return;
            }
            try {
                numberOfThreads = Integer.parseInt(args[0]);
            } catch(NumberFormatException ne) {
            
            }
            CountDownLatch latch = new CountDownLatch(numberOfThreads);
            for (int n = 0; n < numberOfThreads; n++) {
                Thread t = new Thread(new DoSomethingInAThread(latch));
                t.start();
            }
            latch.await();
            System.out.println("In Main thread after completion of " + numberOfThreads + " threads");
        } catch(Exception err) {
            err.printStackTrace();
        }
    }
}

輸出:

java CountDownLatchDemo 5
Do some thing
Do some thing
Do some thing
Do some thing
Do some thing
In Main thread after completion of 5 threads

說明:

  1. CountDownLatch 在主執行緒中用計數器 5 初始化
  2. 主執行緒正在使用 await() 方法等待。
  3. 已經建立了五個 DoSomethingInAThread 例項。每個例項都使用 countDown() 方法遞減計數器。
  4. 一旦計數器變為零,主執行緒將恢復