Java閉鎖(CountDownLatch)和柵欄(CyclicBarrier)是兩種常用的線程同步工具。它們都可以用來協調多個線程的執行順序,保證線程的正確性。下面我們來詳細介紹一下這兩種工具。
1. Java閉鎖
public class CountDownLatch { public CountDownLatch(int count) { } public void await() throws InterruptedException { } public void countDown() { } }
CountDownLatch是一種線程同步工具,它可以通過一個計數器來控制多個線程的執行。其中,計數器的初始值由用戶指定,在多個線程執行完成后自動減一,當計數器的值為0時,await()方法就會釋放所有等待線程的鎖。
下面是一個簡單的例子:
public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(3); new Thread(new Runnable() { @Override public void run() { System.out.println("線程1執行完成"); countDownLatch.countDown(); } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println("線程2執行完成"); countDownLatch.countDown(); } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println("線程3執行完成"); countDownLatch.countDown(); } }).start(); countDownLatch.await(); System.out.println("所有線程執行完成"); } }
輸出:
線程3執行完成 線程2執行完成 線程1執行完成 所有線程執行完成
2. Java柵欄
public class CyclicBarrier { public CyclicBarrier(int parties, Runnable barrierAction) { } public int await() throws InterruptedException, BrokenBarrierException { } }
CyclicBarrier是一種線程同步工具,它可以讓一組線程在同一個時間點上達到同步點。其中,parties指定了需要同步的線程個數,當所有線程都調用了await()方法后,barrierAction就會被執行。
下面是一個簡單的例子:
public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() { @Override public void run() { System.out.println("所有線程執行完成"); } }); new Thread(new Runnable() { @Override public void run() { System.out.println("線程1執行完成"); try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println("線程2執行完成"); try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println("線程3執行完成"); try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }).start(); } }
輸出:
線程1執行完成 線程2執行完成 線程3執行完成 所有線程執行完成
總結
CountDownLatch和CyclicBarrier都是很有用的線程同步工具,它們各有優點。CountDownLatch更適合一組線程等待另一組線程的任務執行完成,而CyclicBarrier更適合一組線程協作完成某個任務。