问题标签 [blockingqueue]

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 投票
2 回答
239 浏览

java - 并发调用 Java 中的 BlockingQueue

我知道并发添加到 C++ 中的 stl 队列会导致问题,解决此问题的方法是在所有添加/删除调用周围添加互斥锁。

但我目前正在使用 Java 编程,并且正在使用 BlockingQueue。该文档仅说调用 BlockingQueue 对象上的 put/take 的线程被隐式阻塞,直到有空间可以放置/有一些东西可以分别使用。但是,它没有提到任何有关并发 put/take 调用的内容。我需要用互斥锁保护这些吗?

0 投票
2 回答
321 浏览

java - Java:同时从队列中删除对象。

我有一个应用程序可以创建数百个对象 B 和 C 的实例。

有一个对象层次结构,其中对象 Foo 包含 2 个队列(b_queue 和 c_queue),一个填充 B 类型的对象,另一个填充 C 类型的对象。

当 B 或 C 中发生某些事件时,我希望它们将自己从对象 Foo 中的队列中删除。

我的解决方案是构造一个对象 B 或 C,将 Foo 的实例(称为 foo_inst)交给他们,将它们存储在其队列中。然后在 B 或 CI 内部可以调用 foo_inst.b_queue.remove(this)。

1)这将是一个好的/有效的方法,还是应该避免?

B 和 C 都是 Runnable 对象,将与 ThreadPoolExecutor 一起排队。这意味着它们可能会在工作队列上两次,并且可能会尝试同时调用 foo_inst.b_queue.remove(this),或者在它已经完成之后调用。

2)这也会造成问题吗?

非常感谢任何帮助或提示。

好的,到目前为止,我已经在一些帮助下做到了这一点。(欢迎更多帮助):

}

0 投票
2 回答
370 浏览

java - 生产者-消费者:如何知道生产完成的通知

我有以下情况:

  1. 从数据库中读取数据
  2. 做“计算”工作
  3. 将结果写入数据库

我有一个从数据库读取并将生成的对象放入 BlockingQueue 的线程。这些对象非常重,因此队列限制了内存中的对象数量。多个线程从队列中获取对象,执行工作并将结果放入第二个队列。最后一个线程从第二个队列中获取结果并将结果保存到数据库中。

问题是如何防止死锁,例如。“计算线程”需要知道何时不再有对象放入队列。目前,我通过将线程的引用(可调用)相互传递并在轮询或提议之前检查 thread.isDone() 以及元素是否为空来实现这一点。我还检查了队列的大小,只要其中有元素,就必须消耗。使用 take 或 put 会导致死锁。

有没有更简单的方法来实现这一点?

0 投票
3 回答
10926 浏览

java - 异步通知 BlockingQueue 有可用项目

当有些人有要提供的物品时,我需要Object异步通知。BlockingQueue

我已经在 J​​avadoc 和网络上搜索了一个预制的解决方案,然后我最终得到了一个(可能是天真的)我的解决方案,这里是:

基本上,队列的操作有一个线程阻塞,take()每次take()操作成功时都会回调侦听器对象,可以选择发回一个特殊cookie对象(如果需要,请忽略它)。

问题是:有没有更好的方法来做到这一点?我是否犯了一些不可原谅的错误(在并发/效率和/或代码清洁方面)?提前致谢。

0 投票
2 回答
1840 浏览

java - 观察者 - BlockingQueue

我正在使用观察者模式和 BlockingQueue 来添加一些实例。现在在另一种方法中我正在使用队列,但似乎 take() 正在等待永远,即使我这样做是这样的:

而 mDiffQueue 是一个 LinkedBlockingQueue ,我使用它是这样的:

但我认为第一个表达式被检查,而 mDone 不是真的,那么也许 mDone 设置为真(观察者总是多线程的?),但它已经在调用 mDiffQueue.take()?:-/

编辑:我现在真的不明白。我最近将其更改为:

如果我在调试器中稍等片刻,它可以工作,但它也应该“实时”工作,因为 mDone 被初始化为 false,因此 while 条件应该为真,并且应该执行主体。

如果 mDiffQueue 为空且 mDone 为 true,则它应该跳过 while 循环的主体(这意味着队列不再填充)。

编辑:似乎是:

即使我不明白为什么 peek() 是强制性的。

编辑:

我正在做的是遍历一棵树,我想跳过所有 INSERTED 节点:

基本上计算树中的最大深度或级别,而不考虑在树的另一个修订版中已删除的节点(用于比较 Sunburst 可视化),但是好的,这可能超出了范围。只是为了说明我正在对尚未插入的节点做一些事情,即使它只是调整最大深度。

问候,

约翰内斯

0 投票
2 回答
152 浏览

java - 并发应用程序不如单线程快

我已经实施了一种管道方法。我要遍历一棵树,我需要某些事先不可用的值......所以我必须并行(或之前)遍历树,并且对于我想要保存值的每个节点(descendantCount 例如)。

因此,我正在遍历树,然后从构造函数中调用一个方法,该方法调用通过 ExecutorService 启动的新线程。提交的 Callable 是:

因此,对于每个节点,它都会创建一个新的 Callable,它遍历每个节点的树并计算后代和修改(我实际上是将两个树修订融合在一起)。嗯,mDescendantsQueue 和 mModificationQueue 是 BlockingQueues。起初我只有descendantsQueue 并再次遍历树以获取每个节点的修改(计算在当前节点的子树中所做的修改)。然后我想为什么不并行执行并实现流水线方法。可悲的是,每次我实施另一个多线程“步骤”时,性能似乎都在下降。

也许是因为 XML 树通常不是那么深,并且并发开销太重:-/

起初我按顺序做所有事情,这是最快的: - 遍历树 - 每个节点遍历后代并计算 descendantCount 和 modifyCount

在对 BlockingQueues 使用流水线方法后,性能似乎有所下降,但我实际上没有进行任何时间测量,我必须恢复许多更改才能返回 :( 也许随着 CPU 的增加性能会提高,因为我只有一个Core2Duo 现在用于测试。

最好的问候,
约翰内斯

0 投票
4 回答
2384 浏览

java - Java:尝试将对象添加到 BlockingQueue 时出现 NullPointerException?

我发现了一个关于 PriorityQueue 的类似问题,那个错误是它没有正确初始化。我可能有同样的问题,但我不知道如何正确初始化它!

截至目前,我只是这样做:

阻塞队列 myQueue = null;

但是,一旦我尝试将某些内容添加到列表中,就会引发异常。

如何正确初始化 BlockingQueue?

0 投票
1 回答
876 浏览

java - 我是否应该显式唤醒一个吸食 BlockingQueue.take() 的线程以提高性能?

我知道BlockingQueue使用该take() 方法让线程吸吮 a 的元素将等待一个元素可用(除非它被中断)。

我有两个问题:

i) 线程是否会在元素可用时自动唤醒或是否存在延迟(即线程稍后会检查自身)?

ii)如果有延迟,唤醒线程是否有意义(例如通过显式中断它)?我正在考虑延迟和性能。

0 投票
1 回答
634 浏览

java - LinkedBlockingQueue 和原语

我需要一个 LinkedBlockingQueue 但我将原语传递给它。我添加到队列的数据速率约为每秒 4 毫秒或 256 个数据点。我遇到的问题是数据在开始时立即开始延迟,但随着时间的推移,JIT 似乎使这更有效,并且最终实时结束。我试图找出我需要减少初始延迟的地方,其中之一是从队列中每个插入的自动装箱中“更新”一个 Float 对象。有人有使用原语的 LinkedBlockingQueue 吗?

或者当您不确定大小和使用原语时,是否有比 LinkedBlockingQueue 更快的东西?

0 投票
6 回答
42550 浏览

c++ - C++11 中有并发容器吗?

特别是,我正在寻找一个阻塞队列。C ++ 11中有这样的事情吗?如果没有,我的其他选择是什么?我真的不想再自己下降到线程级别了。太容易出错了。