Java 中的 CountDownLatch

java8object oriented programmingprogramming

对于并发执行,Java 中的 CountDownLatch 是一个重要的类,它确保一个或多个线程在队列中,以便其他线程完成其操作集。

为了更好地理解 Java 中的 CountDownLatch,在本文中,您将通过示例和 CountDownLatch 的方法了解 CountDownLatch 的工作原理。

Java 中的 CountDownLatch 及其工作流程

根据计数值,CountDownLatch 有多种用途,如下所示 -

  • 当我们以计数值 1 开始 CountDownlatch 时,它将简单地用作开/关闩锁或门。

  • 另一方面,当我们以计数值 N 开始 CountDownLatch 时,它会导致一个线程等待,直到 N 个线程完成某个操作或某个操作已完成 N 次。

Java 中的 CountDownLatch 的工作原理

在创建 CountDownLatch 对象期间,我们应该定义它必须等待的线程数。一旦指定,所有此类线程都需要通过调用 CountDownLatch.countDown() 进行倒计时。达到零后,队列中的任务开始运行。

示例

这是一个 Java 程序,说明 Java 中的 CountdownLatch −

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 类继承自 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.倒计时

CountDownLatch 类提供的另一个关键方法是 countdown() 方法。它记录所有闩锁计数,并在计数达到零时释放所有等待线程。它做了以下事情 -

  • 当当前计数大于零时,计数减少。

  • 当新计数为零时,所有等待线程将重新启用以进行线程调度。

  • 但是,在当前计数等于零的情况下不会发生任何事情。

6. getCount

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

语法

public long getCount()

它不接受任何参数,但它返回闩锁的当前计数。

7. toString

CountDownLatch 类提供的最后一个方法是 toString() 方法。它用于获取将确定闩锁及其状态的字符串。

语法

public String toString()

8. 覆盖

它覆盖 Object 类中的 toString。

9.返回

它返回将确定闩锁及其状态的字符串。

总结

至此,我们已经结束了 CountDownLatch 教程。我们希望您现在已经了解了 countDownLatch 是什么以及它是如何工作的。我们还为您提供了示例和代码以供参考。如果您觉得这篇文章有帮助,请给我们点赞。


相关文章