CountDownLatch 与信号量

2023-12-13

使用有什么好处吗

java.util.concurrent.CountdownLatch

代替

java.util.concurrent.Semaphore?

据我所知,以下片段几乎是等效的:

1. 信号量

final Semaphore sem = new Semaphore(0);
for (int i = 0; i < num_threads; ++ i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        sem.release();
      }
    }
  };
  t.start();
}

sem.acquire(num_threads);

2:倒计时锁存器

final CountDownLatch latch = new CountDownLatch(num_threads);
for (int i = 0; i < num_threads; ++ i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        latch.countDown();
      }
    }
  };
  t.start();
}

latch.await();

除了第二种情况,锁存器不能重用,更重要的是,您需要提前知道将创建多少个线程(或者等到它们全部启动后再创建锁存器。)

那么在什么情况下闩锁可能更可取呢?


CountDownLatch经常用于与您的示例完全相反的情况。一般来说,你会有很多线程阻塞await()当倒计时为零时,所有这些都会同时开始。

final CountDownLatch countdown = new CountDownLatch(1);

for (int i = 0; i < 10; ++ i) {
   Thread racecar = new Thread() {    
      public void run() {
         countdown.await(); //all threads waiting
         System.out.println("Vroom!");
      }
   };
   racecar.start();
}
System.out.println("Go");
countdown.countDown();   //all threads start now!

您还可以将其用作 MPI 样式的“屏障”,使所有线程在继续之前等待其他线程赶上某个点。

final CountDownLatch countdown = new CountDownLatch(num_thread);

for (int i = 0; i < num_thread; ++ i) {
   Thread t= new Thread() {    
      public void run() {
         doSomething();
         countdown.countDown();
         System.out.printf("Waiting on %d other threads.",countdown.getCount());
         countdown.await();     //waits until everyone reaches this point
         finish();
      }
   };
   t.start();
}

综上所述,CountDownLatch可以按照您在示例中所示的方式安全地使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CountDownLatch 与信号量 的相关文章

  • 使用 Java-Large 文件查询 JSON 文件

    我正在尝试使用 java 解析下面的 JSON 文件 我需要能够 按 ID 或名称或对象中的任何字段搜索文件 也在字段中搜索空值 搜索应返回整个对象 该文件将会很大 并且搜索应该仍然很省时 id 1 name Mark Robb last
  • 如何更改 JComboBox 下拉列表的宽度?

    我有一个可编辑的JComboBox其中包含单个字母值的列表 因此 组合框非常小 每个字母都有特殊的含义 对于很少使用的字母 有时用户并不清楚 因此我创建了一个自定义ListCellRenderer显示下拉列表中每个字母的含义 不幸的是 这个
  • TestNG 启动期间发生内部错误

    我创建了一个 TestNG 类 FirstTest java 当我将测试用例作为 TestNG Test 运行时 出现以下错误 期间发生内部错误 启动 FirstTest java lang NullPointerException Ecl
  • 如何在 Android 中恢复我的音频?

    我必须实现用于创建具有暂停和恢复状态的音频的应用程序 当我的应用程序作为启动时音频启动 当我按下模拟器上的后退按钮时 音频音乐处于暂停状态 但是当我的活动回来时从停止状态到前台我的音频音乐未恢复 这是我的代码 public class Au
  • 使用 CXF 通过 HTTP 基本身份验证使用 Web 服务时出现 401 错误

    我正在尝试在 JUnit 测试中使用使用 HTTP 基本身份验证 使用 Apache CXF 的远程 Web 服务 我收到的错误是 javax xml ws WebServiceException Failed to access the
  • 如何向 OkHttp 请求拦截器添加标头?

    我将这个拦截器添加到我的 OkHttp 客户端 public class RequestTokenInterceptor implements Interceptor Override public Response intercept C
  • Spring boot 404错误自定义错误响应ReST

    我正在使用 Spring boot 来托管 REST API 即使浏览器正在访问 URL 以及自定义数据结构 我也希望始终发送 JSON 响应 而不是使用标准错误响应 我可以使用 ControllerAdvice 和 ExceptionHa
  • Java:BufferedInputStream 的 available() 方法存在问题

    我正在处理以下代码 用于将大文件拆分为一组较小的文件 FileInputStream input new FileInputStream this fileToSplit BufferedInputStream iBuff new Buff
  • Eclipse 内容协助无法在枚举常量参数列表中工作

    使用 eclipse 当我输入以下内容时 public enum Foo A Integer private final Integer integer private Foo Integer integer this integer in
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • 在Tomcat中设置环境变量TESSDATA_PREFIX

    我们正在使用名为 Tess4J 的 Tesseract OCR Java 库 如果作为独立应用程序运行 它可以正常工作 它需要一个名为 TESSDATA PREFIX 的变量 其中包含 tessdata 配置和其他字符集相关文件 它也可以与
  • 更改 Spring Web 应用程序的默认会话超时

    我必须测试一个由 spring 和 jsp 编写的 Web 应用程序 应用程序的默认会话超时为 30 分钟 我想减少会话超时 为此 我改变了web xml文件输入tomcatInstallationLocation conf 但这不起作用
  • 基于Java模式分割字符串

    您好 我有以下模式的日志文件 2014 03 06 03 21 45 432 ERROR mfs pool 3 thread 19 dispatcher StatusNotification Error processing notific
  • JavaFX 8 默认消息图标

    随着 JavaFX 的最近几次更新 我们收到了警报 我想获取消息的默认图标 错误 警告 在Swing中 我可以通过一些方式获取L F消息图标UIManager的属性 如何在 JavaFX 中获取消息的默认图标 它们是包含在属性中 还是由 C
  • JSF“总”变量类似于 JSTL 中的 c:set

    我不喜欢 JSF 但我需要用它来解决这个问题 我正在 纯 JSF 中工作 所以这就是我基本上需要的 但我不知道如何用 JSF 来实现它
  • 使用 OpenNLP 获取句子的解析树。陷入困境。

    OpenNLP 是一个关于自然语言处理的 Apache 项目 NLP 程序的目标之一是解析一个句子 并给出其语法结构的树 例如 天空是蓝色的 这句话 可能会被解析为 S NP VP The sky is blue where S是句子 NP
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • 如何使用 Kafka 发送大消息(超过 15MB)?

    我发送字符串消息到Kafka V 0 8使用 Java Producer API 如果消息大小约为 15 MB 我会得到MessageSizeTooLargeException 我尝试过设置message max bytes到 40 MB
  • 丰富:数据表行跨度问题

    我需要创建一个 rich dataTable 甚至扩展 具有以下功能 我有一个公司类 其中包含产品对象的集合 我想展示下表 我仍然没有弄清楚如何使用子表执行此操作 在所有示例中 我发现子表具有与主表完全相同的列 据推测 我需要在前两列中使用
  • 使用 Spring Batch 将文件中的日期解析为 LocalDateTime

    我正在尝试使用 Spring Batch 读取包含日期的 CSV 文件 但在将日期解析为LocalDateTime Object 字段 日期 上的对象 目标 中的字段错误 拒绝值 2017 07 20 04 15 25 0 代码 typeM

随机推荐

  • 访问 cvCreateMatND 的元素

    我是 OpenCV 新手 我正在尝试创建一个 n 维数组并使用 CvMatND 访问每个元素 我可以通过 data i step j nchannels 0 访问二维矩阵 如何访问由 int size 12 12 12 CvMatND ma
  • Spring Data REST 不包括资源中的实体链接

    由 Oliver Gierke 的解决方案解决 看起来这是 Spring 4 2 0 中的一个已知错误 升级到 4 2 1 已经提供了预期的功能 原始问题 我正在努力将我的开发团队转移到 Spring WebMVC Data REST Da
  • 通过 Process Explorer 中的“结束进程”防止用户进程被终止

    我注意到 GoogleToolbarNotifier exe 无法从 Process Explorer 中杀死 它返回 访问被拒绝 它以用户身份运行 以 正常 优先级运行 并且从程序文件运行 他们是如何做到的呢 我认为可能有一种方法可以修改
  • 我如何调用动态变量名?

    好的 所以我正在尝试制作一个程序来 理解 用户输入并执行他们告诉它的操作 人们通常只使用特定的命令 例如 打开此文件 并且只有当用户完全键入该命令时它才有效 我试图给我的用户一点回旋余地 这样他们就可以输入他们想要发生的事情 然后计算机就会
  • Azure DevOps 解决拉取请求冲突

    所以 我对 Azure 有一个非常奇怪的问题 在拉取请求中 它检测到一些冲突 但没有显示它们在哪里 以及我需要更改什么 在此之前 Visual Studio 从以下位置收集了大量垃圾 vs文件夹 并且显示与之冲突 因此 我删除了分支中的这些
  • 无法理解 Linux 内核模块中 read_proc 的工作

    我正在查看内核模块示例page 程序中使用的read proc如下 int fortune read char page char start off t off int count int eof void data int len if
  • “代码已覆盖”与“代码已测试”?

    将我当前的代码项目转换为 TDD 我注意到了一些事情 class Foo public event EventHandler Test public void SomeFunction snip Test this new EventArg
  • Javascript:将数组转换为对象

    这是转换的最简单方法 src websrv1 dst websrv2 dstport 80 to this src websrv1 dst websrv2 dstport 80 为了将其传递给 AJAX 数据 我在用着视觉搜索它返回一个 F
  • LocalReport方法渲染的线程文化

    我正在 asp net 应用程序中使用 localreport 对象 该报告由一组对象提供 因此 在呈现报表时 会调用该类的一些属性 Class ClassForReport string Date get return aDate Tos
  • 将 css 类添加到 wtform 中的字段

    我正在使用 wtforms 和 Flask 生成动态表单 我想向我生成的字段添加一些自定义 css 类 但到目前为止我还无法这样做 使用我找到的答案here 我尝试使用自定义小部件来添加此功能 它的实现方式几乎与该问题的答案完全相同 cla
  • VueJS 上传带有附加数据的图像

    我正在尝试将图像上传到服务器 同时使用以下方法传递一些附加数据 在同一发布请求中 VueJS 2 CLI 3 axios multer sharp 我在后端有 NodeJS 和 MongoDB 前端
  • Facebook api 在 openActiveSession 期间挂在“正在打开”状态

    我第一次可以正常登录 我有一个选项 用户可以在 Android 应用程序中禁用 facebook 选择此选项后 Facebook 状态将变为 关闭 当我再次使用该选项时 重新登录 API 会在回调函数中的 OPENING 处挂起 根据我发现
  • 使用 VideoWriter 从 OpenCV 打开 GStreamer 管道

    我正在使用 OpenCV 捕获和处理视频帧 我想将它们写入 h265 视频文件 我正在努力从 OpenCV 获得合适的 Gstreamer 管道 Gstreamer 本身工作得很好 特别是 我能够运行此命令 它可以非常快速地对视频进行编码
  • matplotlib:重绘前清除散点数据

    我在 imshow 地图 上有一个散点图 我想要一个点击事件来添加一个新的散点 这是我通过 scater newx newy 完成的 问题是 然后我想添加使用选择事件删除点的功能 由于没有删除 pickX PickY 函数 我必须获取选定的
  • AWS Redshift 数据透视表所有维度

    我正在遵循在 redshift 中旋转大表的方法 使用 Amazon RedShift PostgreSQL 透视表 然而 我有大量的组需要旋转 即m1 m2 如何循环遍历所有不同的值并对每个值应用相同的逻辑并为结果列名称指定别名 如果您希
  • 如果我向 application.properties 添加任何值,Spring Boot 项目就会崩溃

    我只是想将环境变量添加到我的项目中 无论我添加什么到我的application properties文件 程序崩溃并且pom xml突然变得无效并在我的 IDE 中突出显示为红色 例如 如果我将其添加到我的application prope
  • 什么时候允许调用“BarcodeScanner.GetDefaultAsync()”?

    我正在尝试使用新的Windows 8 1 服务点 API对于条形码扫描仪 如果我打电话GetDefaultAsync 从以下任何位置 它返回null App OnLaunched 第一页 Loaded 第一页OnNavigatedTo 第一
  • 直接在默认浏览器中打开Shiny App

    通常 闪亮的应用程序通过 R Studio 中的内置浏览器打开 是否可以直接在网络浏览器 例如 Google Chrome 中打开应用程序 而无需通过 R Studio 在我的 Rstudio 版本 0 98 1103 中 我可以更改运行应
  • 正则表达式匹配 JavaScript 中字符串的全部或初始部分

    我正在尝试找出一个正则表达式 它将与以下条件匹配 我要匹配的字符串 var txt This is Regex 用户可以输入如下内容 这个 有效 Th 有效 这是 有效 这是Reg 有效 这是正则表达式 有效 Tis 无效 是无效的 Reg
  • CountDownLatch 与信号量

    使用有什么好处吗 java util concurrent CountdownLatch 代替 java util concurrent Semaphore 据我所知 以下片段几乎是等效的 1 信号量 final Semaphore sem