Java中的CountDownLatch


對於併發執行,Java中的CountDownLatch是一個重要的類,它確保一個或多個執行緒排隊,等待其他執行緒完成其操作集。

為了更好地理解Java中的CountDownLatch,在本文中,您將學習CountDownLatch的工作原理,並透過示例和方法來了解CountDownLatch。

Java中的CountDownLatch及其工作流程

基於計數值,CountDownLatch用於多種目的,如下所示:

  • 當我們以計數值1開始CountDownLatch時,它將簡單地充當開/關閂鎖或門。

  • 另一方面,當我們以計數值N開始CountDownLatch時,它會導致一個執行緒等待,直到N個執行緒完成某些操作或某個操作已完成N次。

以下是Java中CountDownLatch的工作原理

在建立CountDownLatch物件期間,我們應該定義它必須等待的執行緒數。一旦指定,所有此類執行緒都必須透過呼叫CountDownLatch.countDown()來進行倒計時。當達到零時,佇列中的任務開始執行。

示例

這是一個說明Java中CountdownLatch的Java程式:

import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo{ public static void main(String args[]) throws InterruptedException{ // Lets create a task that needs to wait for four threads before it begins CountDownLatch latch = new CountDownLatch(4); // Let's create four employee threads and begin them. Employee first = new Employee(1000, latch,"EMPLOYEE-1"); Employee second = new Employee(2000, latch,"EMPLOYEE-2"); Employee third = new Employee(3000, latch,"EMPLOYEE-3"); Employee fourth = new Employee(4000, latch,"EMPLOYEE-4"); first.start(); second.start(); third.start(); fourth.start(); // The main task waits for four threads latch.await(); // Main thread has started System.out.println(Thread.currentThread().getName() +" has finished"); } } // A class to represent threads for which the main thread waits. class Employee extends Thread{ private int delay; private CountDownLatch latch; public Employee(int delay, CountDownLatch latch,String name){ super(name); this.delay = delay; this.latch = latch; } @Override public void run(){ try{ Thread.sleep(delay); latch.countDown(); System.out.println(Thread.currentThread().getName()+ " finished"); } catch (InterruptedException e){ e.printStackTrace(); } } }

輸出

EMPLOYEE-1 finished
EMPLOYEE-2 finished
EMPLOYEE-3 finished
EMPLOYEE-4 finished
main has finished

從上面的程式中,我們可以理解它從我們傳遞給建構函式的計數開始。每當呼叫countDown()方法時,await方法都會停止,直到計數達到0。在此點之後,所有等待的執行緒都將被釋放,並且對await的任何後續呼叫都將立即返回。

理解CountDownLatch的建構函式

CountDownLatch的建構函式是引數化的,它只接受一個整數作為計數值。它構造CountDownLatch並以給定的計數值開始它。

注意:每當計數的值為負時,建構函式都會丟擲IllegalArgumentException

語法

public CountDownLatch( int count )

引數

count -> 它表示線上程可以透過await()之前,必須在countdown()上呼叫的次數。

CountDownLatch的方法

CountDownLatch類中有多種方法可用於併發控制。此外,CountDownLatch類還繼承了java.lang.Object類的所有方法。

java.lang.Object類的方法如下:

  • clone

  • equals

  • finalize

  • getClass

  • hashCode

  • notify

  • notifyAll

  • wait

  • wait

  • wait

CountDownLatch提供了以下方法:

1. await()

await()方法使當前執行緒保持掛起狀態,直到以下任一情況發生:

  • 閂鎖已倒計時至零。

  • 執行緒未被中斷。

如果當前計數值為零,則await()方法立即返回。

只要當前計數既不為零也不為負,await()方法就會停用當前執行緒以進行排程,並且執行緒將保持休眠狀態,直到發生以下情況之一:

  • 由於呼叫countDown(),計數值達到零。

  • 另一個執行緒中斷當前執行緒。

語法

以下是await()方法的語法:

public void await()

它不接受或返回值。

丟擲

噹噹前執行緒在等待時被中斷時,await()方法丟擲InterruptedException。

2. await()

這是await()方法的另一種變體,它使當前執行緒等待,直到以下任一情況發生:

  • 閂鎖已倒計時至零。

  • 指定的等待時間已結束。

  • 執行緒的中斷。

噹噹前計數值為零時,await()方法立即返回true。

只要當前計數既不為零也不為負,await()方法就會停用當前執行緒以進行排程,並且執行緒將保持休眠狀態,直到發生以下情況之一:

  • 由於呼叫countDown(),計數值達到零。

  • 指定的等待時間結束。

  • 當前執行緒被其他執行緒中斷。

語法

public boolean await( long timeout, TimeUnit unit)

語法中使用的引數

  • timeout - 這是一個long型別的引數,指定最大等待時間。

  • unit - 指定timeout引數的時間單位。

3. 返回值

當計數達到零時,它返回true,而當等待時間在計數達到零之前結束時,它返回false。

4. 丟擲

當等待期間當前執行緒被中斷時,await()方法丟擲InterruptedException。

5. Countdown

CountDownLatch類提供的另一個關鍵方法是countdown()方法。它記錄所有閂鎖計數,並在計數達到零時釋放所有等待的執行緒。它執行以下操作:

  • 噹噹前計數大於零時,計數遞減。

  • 當新計數為零時,所有等待的執行緒都將重新啟用以進行執行緒排程。

  • 但是,噹噹前計數等於零時,不會發生任何事情。

6. getCount

getCount()是CoutDownLatch類提供的另一個重要方法。它用於獲取當前使用的閂鎖的計數。

語法

public long getCount()

它不接受任何引數,而是返回閂鎖的當前計數。

7. toString

CountDownLatch類提供的最後一個方法是toString()方法。它用於獲取一個字串,該字串將確定閂鎖及其狀態。

語法

public String toString()

8. 重寫

它重寫了Object類中的toString方法。

9. 返回值

它返回一個字串,該字串將確定閂鎖及其狀態。

總結

至此,我們已經完成了CountDownLatch教程。我們希望您現在已經瞭解了什麼是countDownLatch以及它是如何工作的。我們還為您提供了示例和程式碼以供參考。如果您覺得本文有所幫助,請點贊。

更新於: 2022年10月13日

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.