溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

倒計時器CountDownLatch舉例分析

發布時間:2021-12-14 15:13:52 來源:億速云 閱讀:131 作者:iii 欄目:大數據
# 倒計時器CountDownLatch舉例分析

## 一、CountDownLatch概述

`CountDownLatch`是Java并發包(`java.util.concurrent`)中的一個同步工具類,它允許一個或多個線程等待其他線程完成操作后再繼續執行。其核心思想是通過一個計數器來實現線程間的協調,當計數器歸零時,等待的線程將被喚醒。

### 核心方法
- `CountDownLatch(int count)`:構造函數,初始化計數器
- `countDown()`:計數器減1
- `await()`:阻塞當前線程直到計數器歸零

## 二、典型應用場景

1. **主線程等待子線程初始化完成**
2. **并行任務同步**
3. **模擬高并發測試**
4. **服務啟動前的依賴檢查**

## 三、代碼示例分析

### 場景模擬:賽跑比賽
假設有5名運動員參賽,裁判需要等待所有運動員到達終點后才能宣布比賽結束。

```java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class RaceExample {
    public static void main(String[] args) throws InterruptedException {
        final int RUNNER_COUNT = 5;
        CountDownLatch startSignal = new CountDownLatch(1);  // 發令槍
        CountDownLatch finishSignal = new CountDownLatch(RUNNER_COUNT);  // 終點線
        
        for (int i = 1; i <= RUNNER_COUNT; i++) {
            new Thread(new Runner(startSignal, finishSignal, "運動員"+i)).start();
        }
        
        System.out.println("裁判準備發令...");
        TimeUnit.SECONDS.sleep(2);  // 模擬準備時間
        startSignal.countDown();     // 發令槍響
        System.out.println("比賽開始!");
        
        finishSignal.await();        // 等待所有運動員到達終點
        System.out.println("所有運動員到達終點,比賽結束!");
    }
}

class Runner implements Runnable {
    private final CountDownLatch startSignal;
    private final CountDownLatch finishSignal;
    private final String name;
    
    public Runner(CountDownLatch start, CountDownLatch finish, String name) {
        this.startSignal = start;
        this.finishSignal = finish;
        this.name = name;
    }
    
    @Override
    public void run() {
        try {
            startSignal.await();  // 等待發令槍
            
            System.out.println(name + "起跑...");
            TimeUnit.MILLISECONDS.sleep((long)(Math.random() * 3000));  // 模擬跑步時間
            System.out.println(name + "到達終點!");
            
            finishSignal.countDown();  // 到達終點計數器減1
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

執行結果示例:

裁判準備發令...
比賽開始!
運動員1起跑...
運動員3起跑...
運動員5起跑...
運動員2起跑...
運動員4起跑...
運動員3到達終點!
運動員1到達終點!
運動員5到達終點!
運動員2到達終點!
運動員4到達終點!
所有運動員到達終點,比賽結束!

四、實現原理

  1. AQS基礎:基于AbstractQueuedSynchronizer實現
  2. 共享鎖模式:所有等待線程共享同一個同步狀態
  3. 不可重置:計數器歸零后無法重復使用(與CyclicBarrier的主要區別)

五、注意事項

  1. 避免死鎖:確保countDown()一定會被執行
  2. 性能考慮:計數器初始值不宜過大
  3. 異常處理:中斷處理需要謹慎
  4. 不可重用:需要重復使用時考慮CyclicBarrier

六、與相關類的對比

特性 CountDownLatch CyclicBarrier Semaphore
是否可重用
主要作用 等待事件完成 線程集合點 控制并發量
計數器變化方向 遞減 遞增 可增可減
觸發動作 計數到0自動觸發 到達屏障數執行回調 獲取/釋放許可

七、總結

CountDownLatch是解決多線程協同問題的有效工具,特別適用于”主從協作”模式。理解其原理和適用場景,可以幫助我們編寫更健壯的并發程序。在實際開發中,應根據具體需求選擇合適的同步工具。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女