Java 中的 CountDownLatch

2025年5月12日 | 阅读 5 分钟

CountDownLatch 类是另一个用于并发执行的重要类。它是一种同步辅助工具,允许一个或多个线程等待,直到另一个线程中正在执行的一组操作完成。

它使用我们在构造函数中传递的计数进行初始化。调用 countDown() 方法会阻塞 await 方法,直到当前计数达到零,之后所有等待的线程都会被释放,并且任何后续对 await 的调用会立即返回。CountDownLatch 不要求调用 countdown() 的线程等待计数达到零再继续。它会阻止任何线程在所有线程都能通过之前,提前通过 await

CountDownLatch in Java

CountDownLatch 根据 count 值用于多种目的

  1. 如果我们用计数 1 初始化 CountDownlatch,它将作为简单的开关锁或门。
  2. 如果我们用计数 N 初始化 CountDownLatch,它将用于让一个线程等待,直到 N 个线程完成某个操作,或者某个操作已完成 N 次。

CountDownLatch 的构造函数

CountDownLatch 提供了一个参数化构造函数。它接受一个整数值作为计数。它构造 CountDownLatch 并用给定的计数值进行初始化。

注意:当 count 的值为负数时,构造函数会抛出 IllegalArgumentException。

语法

参数

count -> 这是在线程能够通过 await() 之前必须调用 countdown() 的次数。

CountDownLatch 的方法

CountDownLatch 类有几种可用于并发控制的方法。CountDownLatch 类还提供了 java.lang.Object 类的方法,因为它由 CountDownLatch 类继承。

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

  1. clone
  2. equals
  3. finalize
  4. getClass
  5. hashCode
  6. notify
  7. notifyAll
  8. wait
  9. wait
  10. wait

如果您不了解 Object 类的方法,请参考以下链接:object-class

CountDownLatch 提供了以下方法:

1. await()

await() 方法使当前线程等待,直到以下情况之一未发生:

  1. 锁存器已计数至零。
  2. 线程未被中断。

当当前计数设置为零时,await() 方法会立即返回。

当当前计数既不为零也不是负数时,await() 方法会禁用当前线程的调度,并且当前线程将保持休眠状态,直到发生以下情况之一:

  • 由于调用 countDown(),计数的值达到零。
  • 当前线程被另一个线程中断。

语法

await() 方法具有以下语法:

它不接受任何值,也不返回任何值。

抛出

当当前线程在等待时被中断,await() 方法会抛出 InterruptedException

2. await()

这是 await() 方法的另一种变体,它使当前线程等待,直到以下情况未发生:

  1. 锁存器已计数至零。
  2. 指定的等待时间已过。
  3. 线程被中断。

当当前计数设置为零时,await() 方法会立即返回 true。当等待时间在计数达到零之前已过时,它会返回 false。

当当前计数既不为零也不是负数时,await() 方法会禁用当前线程的调度,并且当前线程将保持休眠状态,直到发生以下情况之一:

  • 由于 countDown() 的调用,计数值达到零。
  • 指定的等待时间已过。
  • 当前线程被另一个线程中断。

语法

参数

timeout: timeout 参数是 long 类型,定义了最大等待时间。

unit: unit 参数是 TimeUnit 类型,定义了 timeout 参数的时间单位。

返回值

当计数达到零时返回 true,当等待时间在计数达到零之前已过时返回 false。

抛出

当当前线程在等待时被中断,await() 方法会抛出 InterruptedException

3. countdown

countdown() 方法是 CountDownLatch 类提供的另一个重要方法。它记录锁存器的计数,并在计数达到零时释放所有等待的线程。它完成了以下工作:

  1. 当当前计数大于零时,计数会递减。
  2. 当新计数为零时,所有等待的线程将重新启用以进行线程调度。
  3. 当当前计数等于零时,不会发生任何事情。

4. getCount

这是 CoutDownLatch 类提供的另一个重要方法。getCount() 方法用于获取我们当前使用的锁存器的计数。

语法

它不接受任何参数。它返回锁存器的当前计数。

5. toString

toString()CountDownLatch 类提供的最后一个方法。它用于获取一个字符串,该字符串将标识锁存器及其状态。

语法

覆盖

它覆盖了 Object 类中的 toString 方法。

返回值

它返回一个标识锁存器及其状态的字符串。

让我们来看一个 CountDownLatch 的例子,了解它是如何工作的以及如何在 Java 中实现它。

CountDownLatchExample.java

输出

CountDownLatch in Java