Java中的CountDownLatch

类声明

public class CountDownLatch
   extends Object

CountDownLatch类是一种同步辅助工具,它允许一个或多个线程等待直到其他线程执行了必需的操作。

  • CountDownLatch用给定的线程数初始化,该线程数要求在主线程之前完成。

  • CountDownLatch.await()方法阻止主线程执行,直到当前计数达到零为止。countDown()当线程完成任务时,通过执行线程使用方法来减少计数。一旦计数为0,任何等待呼叫都会立即返回。

CountDownLatch方法

以下是CountDownLatch类中可用的重要方法的列表。

序号
方法与说明
1
void await( ) 导致当前线程等待,直到锁存器递减计数到零为止,除非该线程被中断。
2
boolean await(long timeout, TimeUnit unit) 导致当前线程等待,直到锁存器计数到零为止,除非该线程被中断或经过了指定的等待时间。
3
void countDown()减少锁存器的计数,如果计数达到零,则释放所有等待线程。
4
long getCount()返回当前计数。
5
String toString()返回一个标识此锁存器及其状态的字符串。
6
remove( )从集合中删除指定的对象。

示例

以下是解释CountDownLatch功能的示例-

import java.util.concurrent.CountDownLatch;

public class Tester {
   public static void main(String args[]) {
      //将计数器设置为2,即两个应用程序  
      CountDownLatch countDownLatch = new CountDownLatch(4);

      Thread app1 = new Thread(new Application("App1",  countDownLatch));
      Thread app2 = new Thread(new Application("App2",  countDownLatch));          
      Thread app3 = new Thread(new Application("App3",  countDownLatch));
      Thread app4 = new Thread(new Application("App4",  countDownLatch));  
 
      //初始化应用程序
      app1.start();
      app2.start();
      app3.start();
      app4.start();

      try {
         //等到countDownLatch减少到0。-
         countDownLatch.await();            
         //当所有应用程序启动时,打印消息
         System.out.println("所有应用程序都已启动并正在运行。");
      } catch(InterruptedException e) {
         System.out.println(e.getMessage());
      }        
   }
}

class Application implements Runnable {
   private String name;
   private CountDownLatch countDownLatch;

   public Application(String name, CountDownLatch countDownLatch) {
      this.name = name;
      this.countDownLatch = countDownLatch;
   }

   public void run() {
      try {
         System.out.println(name + " started. ");
         Thread.sleep(1000);
      } catch (InterruptedException e) {
         System.out.println(e.getMessage());
      }
      System.out.println( name + " 已启动并正在运行。");
      //将计数减少1-
      countDownLatch.countDown();    
   }
}

这将产生以下结果-

输出结果

App2 started.  
App3 started.  
App1 started.  
App4 started.  
App1 已启动并正在运行。
App3 已启动并正在运行。
App4 已启动并正在运行。
App2 已启动并正在运行。
所有应用程序都已启动并正在运行。