当前位置: 首页 > 编程笔记 >

Java中的CountDownLatch

刘瑞
2023-03-14
本文向大家介绍Java中的CountDownLatch,包括了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 已启动并正在运行。
所有应用程序都已启动并正在运行。
 类似资料:
  • 问题内容: 我的问题可能太广泛了,答案可能是简单的“否”,但我不得不问。 Java 7中有(Java 8)流 *的等效实现吗? 我熟悉(Java 8)流,但是我的项目要求是使用Java 7。 *不要与inputStream和outputStream混淆。 问题答案: 在官方API中,没有。 Java 7没有更多的公共更新。如果您是客户,您可能仍然会获得较小的更新,但是对于反向移植Stream AP

  • 问题内容: 我正在寻找Java中的KeyValuePair类。 由于java.util大量使用接口,因此没有提供具体的实现,只有Map.Entry接口。 我可以导入一些规范的实现吗?这是我讨厌实现100倍的“管道工编程”类之一。 问题答案: 类AbstractMap.SimpleEntry是通用的,并且可能有用。

  • 问题内容: 我已经问过类似的问题,但是这次我将更具体。 我需要在一个循环中执行通常较大的正定对称矩阵(约)的Cholesky分解。现在,为此,我一直尝试: 1)Apache数学库 2)平行柯尔特库 3)JLapack库 在上述三种情况中的任何一种情况下,例如与MATLAB相比,时间消耗都非常长。 因此,我想知道Java中是否存在用于Cholesky分解的高度优化的外部工具:例如,我一直在思考CHO

  • 问题内容: Java 的用途是什么?有什么好处?它是如何工作的?示例代码也将很有用。 问题答案: 关键是要提供线程安全的实现。多个线程可以对其进行读写,而没有机会接收到过时或损坏的数据。 提供自己的同步,因此您不必显式同步对其的访问。 的另一个功能是它提供了该方法,如果指定的键不存在,它将 自动 添加一个映射。考虑以下代码: 此代码不是线程安全的,因为另一个线程可以在到和的调用之间添加映射。正确的

  • 问题内容: 在Java中调用R功能的最佳方法是什么? 我正在寻找一种使用我的Java应用程序在R中制作标准2d散点图和直方图的快速,简便和可靠的方法。我想知道快速Google搜索中出现的哪些程序包/界面最方便使用。 我期待您的建议! 问题答案: 使用JRI:http ://www.rforge.net/JRI/ 。它与rJava捆绑在一起,包括一些用法示例。 一个非常简单的示例如下:

  • 问题内容: 我正在尝试在Java中实现以下代码: 通过使用以下之一: 我浏览了许多SO的示例和问题,但没有找到正确生成iv []的方法(与C中的值相同)。似乎没有办法做到这一点,因为java允许仅以随机(而不是C语言中可用的伪随机)创建此值。这是正确的吗?有人可以帮忙解决这个问题吗? 问题答案: 收到crypt专家的提示,找到了正确的解决方案: