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(long timeout, TimeUnit unit)

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

  • 闩锁已倒计时至零。

  • 指定的等待时间已完成。

  • 线程中断。

当当前计数值为零时,await()方法立即返回true。

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

  • 由于调用countDown(),计数值达到零。

  • 指定的等待时间结束。

  • 当前线程被其他线程中断。

语法

public boolean await( long timeout, TimeUnit unit)

语法中使用的参数

  • **timeout** - 这是一个长整型参数,指定最大等待时间。

  • **unit** - 这指定了timeout参数的时间单位。

3. 返回值

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

4. 抛出异常

当等待期间当前线程中断时,await()方法会抛出InterruptedException异常。

5. countDown

CountDownLatch类提供的另一个重要方法是countDown()方法。它记录所有闩锁计数,并在计数达到零时释放所有等待的线程。它执行以下操作:

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

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

  • 但是,如果当前计数等于零,则不会发生任何事情。

6. getCount

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

语法

public long getCount()

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

7. toString

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

语法

public String toString()

8. 重写

它重写了Object类中的toString方法。

9. 返回值

它返回一个字符串,该字符串将确定闩锁及其状态。

总结

至此,我们已经完成了CountDownLatch教程。我们希望您现在已经了解了CountDownLatch是什么以及它的工作原理。我们还向您展示了示例和代码以供参考。如果您觉得这篇文章有帮助,请点赞。

更新于:2022年10月13日

3K+ 阅读量

开启您的职业生涯

完成课程获得认证

开始学习
广告