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是什么以及它的工作原理。我们还向您展示了示例和代码以供参考。如果您觉得这篇文章有帮助,请点赞。