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+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告