问题标签 [countdownlatch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
16243 浏览

java - 可复位倒计时锁

我需要直接等同于 的东西CountDownLatch,但可以重置(保持线程安全!)。我不能使用经典的同步结构,因为它们在这种情况下根本不起作用(复杂的锁定问题)。目前,我正在创建许多CountDownLatch对象,每个对象都替换了前一个对象。我相信这是在 GC 的年轻一代中发生的(由于对象的绝对数量)。您可以在下面看到使用锁存器的代码(它java.net是 ns-3 网络模拟器接口模拟的一部分)。

一些想法可能是尝试CyclicBarrier(JDK5+)或Phaser(JDK7)

我可以测试代码并回复找到解决此问题的任何人,因为我是唯一可以将其插入正在运行的系统中以查看会发生什么的人:)

干杯,
克里斯

0 投票
4 回答
1105 浏览

java - 为什么 CountDownLatch.getCount() 返回一个 long 但不是 int?

我查看了代码,一切都是int——传递给CountDownLatch构造函数的参数是int,Sync中的变量是int,Sync.getCount()的返回类型是int。但是 CountDownLatch.getCount() 返回一个 long 吗?想知道为什么。

0 投票
3 回答
231 浏览

java - 如何启动 1K 线程并在完成后继续在同一任务上运行线程

如果我创建 1K 线程并使用闩锁同时启动它们,一旦线程完成,我的进程就会结束。

我想要做的是,当线程结束时,启动另一个线程来处理同一个任务(或者以某种方式让同一个线程再次继续处理同一个任务)。

设想:

我想启动 1K 线程,并且不希望在它们完成处理时启动另一个 1K 线程的性能损失。

线程只是简单地建立一个 http url 连接到一个 url http://www.example.com/some/page

我想要做的是连续运行 x 秒,并且始终运行 1K 线程。

我不想为此使用执行器来学习如何在没有它的情况下执行它,并且我相信由于执行器框架将任务和线程分开,它不能保证有多少线程同时运行。

0 投票
1 回答
399 浏览

java - Java 的 CountDownLatch 可以从被动类而不是线程中使用吗?

所以我正在开发这个模拟一天工作的程序,每个工人都是自己的线程。我正在尝试实施工人参加会议的会议,但会议要等到应该参加会议的每个人都到达后才开始。所以我有这种参加会议的方法。

worker 参数是扩展 Thread 的 Employee 类的实例,this.cdStart 是 CountDownLatch。但是,在四名员工的会议上运行此程序时,似乎只有一名员工能够进入,减少计数,然后点击 await() 调用。其他工作线程似乎都无法进入它。我确实注意到许多在线使用示例将 CountDownLock 对象传递给线程本身来处理。有没有理由为什么这不起作用?

0 投票
2 回答
1751 浏览

java - Java:ExecutorService线程与CountDownLatch同步导致死锁?

我为编程练习写了一个人生游戏。生成器有 3 种不同的实现。第一个:一个主线程+N个子线程,第二个:SwingWorker + N个子线程,第三个:SwingWorker + ExecutorService。N 是可用处理器或用户定义的数量。前两个实现运行良好,有一个或多个线程。ExecutorServise 的实现在一个线程上运行良好,但在多个线程上锁定。我尝试了一切,但我无法得到解决方案。

这里是精细工作实现的代码(第二个):

这是执行器服务无法正常工作的代码:

在这里您可以下载我的应用程序示例,带有一个小型启动器。它仅在控制台上打印迭代的结果:链接


现在我的代码如下所示:

但这里又是同样的问题。如果我用一个核心(线程)运行它,就没有问题。如果我将核心数设置为一个以上,它会锁定。在我的第一个问题中,有一个示例链接,您可以运行该示例(在 Eclipse 中)。也许我忽略了前面代码中的一些内容。

0 投票
1 回答
1354 浏览

countdownlatch - CyclicBarrier 和 CountDownLatch?

CyclicBarrier 和 CountDownLatch 有什么区别?我觉得有细微的差别,因为两者看起来都一样。

如果我错了,请告诉我并解释。

0 投票
1 回答
1079 浏览

android - Android中的CountDownLatch问题

我正在使用 countdownlatch,如下例所示。在这里,BackgroundDataPopulator 创建了一个 AyncTask,它反过来调用 PackagePopulator 中的 displayData。但它永远不会发生并且活动卡住了。我在这里做错了什么。

0 投票
1 回答
3639 浏览

java - 多次调用 CountDownLatch.await(int) 超时

我使用 CountDownLatch 来等待来自另一个组件的某个事件(在不同的线程中运行)。以下方法适合我的软件的语义,但我不确定它是否按我的预期工作:

场景应该是这样的:我等待3秒,如果latch没有倒数到0,我用那个变量通知其他组件,然后我最多等待3.5秒。如果再次超时,那么我不在乎,将继续进行其他操作。

注意:我知道它看起来不像,但上面的场景在我的软件中是完全合理和有效的。

我确实阅读了 await(int,TimeUnit) 和 CountDownLatch 的文档,但我不是 Java/Android 专家,所以我需要确认。对我来说,所有场景看起来都有效:

  • 如果第一个 await 成功,那么另一个 await 会立即返回
  • 如果第一个 await 超时,那么另一个 await 仍然有效;因此,如果其他线程注意到静态信号,第二个等待可能会成功返回
  • 两个等待调用都超时(根据我的软件语义这很好)

我使用 await(...) 正确吗?即使同一对象上的前一个 await(...) 超时,是否可以按上述方式使用第二个 await(...) ?

0 投票
1 回答
5218 浏览

java - 当计数为 0 时,线程在 CountDownLatch await() 上阻塞

在分析其中一个生产环境的日志时,我在倒计时等待()上看到了一个处于“W​​AITING”状态的线程

锁存器被初始化为 1,并且另一个线程确实在锁存器的同一实例上调用了 countDown() 方法,但主线程仍然在锁存器上保持阻塞。这导致 jvm 被无限期挂起。

即使锁存器计数达到零也被阻止听起来不合理,我正在寻找有关进一步解决此问题的建议。

有任何想法吗?

注意 - 使用的 jvm 版本如下

java 版本 "1.5.0_15" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_15-b04) Java HotSpot(TM) Client VM (build 1.5.0_15-b04, 混合模式, 共享)

更新 - 下面是我在上面谈论的线程的代码片段

这是我在日志中看到的

在latch.await() 之后的记录器语句从不打印,并且线程转储还表明主线程在latch 上被阻塞。

0 投票
2 回答
955 浏览

java - 等待 Swing 界面关闭后再继续

我一直在寻找解决问题的方法,但我什至很难定义我的搜索词。

我有一个方法可以使用 invokeLater 创建一个 Swing GUI,用户可以在其中完成一些任务。一旦任务完成,窗口关闭并且初始调用线程(例如方法)应该恢复执行。更具体地说,这里是该方法的摘要:

在 GUI 中,我有用于关闭按钮的 actionListeners 并对 CountDownLatch 进行倒计时。

虽然 CountDownLatch 有效,但它不适合我的目的,因为我需要多次运行此 GUI,并且无法增加锁存器。我正在寻找一个更优雅的解决方案 - 我最好的猜测是我需要使用线程,但我不确定如何去做。

任何帮助将非常感激!

更新 一些澄清:正在发生的事情是一个外部类正在调用 dfTestCase.run() 函数并期望返回一个字符串。本质上,流程与调用 dfTestCase.run() 的外部类是线性的--> 被调用的 GUI--> 用户做出决定并单击按钮--> 返回初始调用线程的控制并 run()完成了。

现在我的肮脏解决方案是放一个带有标志的while循环来连续轮询GUI的状态。我希望其他人最终可以提出一个更优雅的解决方案。