Java 併發工具類 CountDownLatch、CyclicBarrier、Semaphore、Exchanger
阿新 • • 發佈:2021-03-28
> 本文部分摘自《Java 併發程式設計的藝術》
## CountDownLatch CountDownLatch 允許一個或多個執行緒等待其他執行緒完成操作。假設現有一個需求:我們需要解析一個 Excel 裡多個 sheet 的資料,此時可以考慮使用多執行緒,每個執行緒解析一個 sheet 的資料,等到所有的 sheet 都解析完之後,程式需要提示解析完成。在這個需求中,要實現主執行緒等待所有執行緒完成 sheet 的解析操作,最簡單的做法就是使用 join() 方法 ```java public class JoinCountDownLatchTest { public static void main(String[] args) throws InterruptedException { Thread parser1 = new Thread(new Runnable() { @Override public void run() { System.out.println("parser2 finish"); } }); Thread parser2 = new Thread(new Runnable() { @Override public void run() { System.out.println("parser2 finish"); } }); parser1.start(); parser2.start(); parser1.join(); parser2.join(); System.out.println("all parser finish"); } } ``` 在 JDK5 之後的併發包中提供的 CountDownLatch 也可以實現 join 的功能,並且比 join 的功能更多 ```java public class CountDownLatchTest { // CountDown 的建構函式接收一個 int 型別的引數作為計數器 // 假設想等待 N 個點完成,就傳入 N static CountDownLatch c = new CountDownLatch(2); public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { System.out.println(1); // 每當呼叫 countDown 方法時,N 就會減一 c.countDown(); System.out.println(2); c.countDown(); } }).start(); // await 會阻塞當前執行緒,直到 N 變成零 c.await(); System.out.println(3); } } ```