问题标签 [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.
java - 并发调用 Java 中的 BlockingQueue
我知道并发添加到 C++ 中的 stl 队列会导致问题,解决此问题的方法是在所有添加/删除调用周围添加互斥锁。
但我目前正在使用 Java 编程,并且正在使用 BlockingQueue。该文档仅说调用 BlockingQueue 对象上的 put/take 的线程被隐式阻塞,直到有空间可以放置/有一些东西可以分别使用。但是,它没有提到任何有关并发 put/take 调用的内容。我需要用互斥锁保护这些吗?
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)这也会造成问题吗?
非常感谢任何帮助或提示。
好的,到目前为止,我已经在一些帮助下做到了这一点。(欢迎更多帮助):
}
java - 生产者-消费者:如何知道生产完成的通知
我有以下情况:
- 从数据库中读取数据
- 做“计算”工作
- 将结果写入数据库
我有一个从数据库读取并将生成的对象放入 BlockingQueue 的线程。这些对象非常重,因此队列限制了内存中的对象数量。多个线程从队列中获取对象,执行工作并将结果放入第二个队列。最后一个线程从第二个队列中获取结果并将结果保存到数据库中。
问题是如何防止死锁,例如。“计算线程”需要知道何时不再有对象放入队列。目前,我通过将线程的引用(可调用)相互传递并在轮询或提议之前检查 thread.isDone() 以及元素是否为空来实现这一点。我还检查了队列的大小,只要其中有元素,就必须消耗。使用 take 或 put 会导致死锁。
有没有更简单的方法来实现这一点?
java - 异步通知 BlockingQueue 有可用项目
当有些人有要提供的物品时,我需要Object
异步通知。BlockingQueue
我已经在 Javadoc 和网络上搜索了一个预制的解决方案,然后我最终得到了一个(可能是天真的)我的解决方案,这里是:
和
基本上,队列的操作有一个线程阻塞,take()
每次take()
操作成功时都会回调侦听器对象,可以选择发回一个特殊cookie
对象(如果需要,请忽略它)。
问题是:有没有更好的方法来做到这一点?我是否犯了一些不可原谅的错误(在并发/效率和/或代码清洁方面)?提前致谢。
java - 观察者 - BlockingQueue
我正在使用观察者模式和 BlockingQueue 来添加一些实例。现在在另一种方法中我正在使用队列,但似乎 take() 正在等待永远,即使我这样做是这样的:
而 mDiffQueue 是一个 LinkedBlockingQueue ,我使用它是这样的:
但我认为第一个表达式被检查,而 mDone 不是真的,那么也许 mDone 设置为真(观察者总是多线程的?),但它已经在调用 mDiffQueue.take()?:-/
编辑:我现在真的不明白。我最近将其更改为:
如果我在调试器中稍等片刻,它可以工作,但它也应该“实时”工作,因为 mDone 被初始化为 false,因此 while 条件应该为真,并且应该执行主体。
如果 mDiffQueue 为空且 mDone 为 true,则它应该跳过 while 循环的主体(这意味着队列不再填充)。
编辑:似乎是:
即使我不明白为什么 peek() 是强制性的。
编辑:
我正在做的是遍历一棵树,我想跳过所有 INSERTED 节点:
基本上计算树中的最大深度或级别,而不考虑在树的另一个修订版中已删除的节点(用于比较 Sunburst 可视化),但是好的,这可能超出了范围。只是为了说明我正在对尚未插入的节点做一些事情,即使它只是调整最大深度。
问候,
约翰内斯
java - 并发应用程序不如单线程快
我已经实施了一种管道方法。我要遍历一棵树,我需要某些事先不可用的值......所以我必须并行(或之前)遍历树,并且对于我想要保存值的每个节点(descendantCount 例如)。
因此,我正在遍历树,然后从构造函数中调用一个方法,该方法调用通过 ExecutorService 启动的新线程。提交的 Callable 是:
因此,对于每个节点,它都会创建一个新的 Callable,它遍历每个节点的树并计算后代和修改(我实际上是将两个树修订融合在一起)。嗯,mDescendantsQueue 和 mModificationQueue 是 BlockingQueues。起初我只有descendantsQueue 并再次遍历树以获取每个节点的修改(计算在当前节点的子树中所做的修改)。然后我想为什么不并行执行并实现流水线方法。可悲的是,每次我实施另一个多线程“步骤”时,性能似乎都在下降。
也许是因为 XML 树通常不是那么深,并且并发开销太重:-/
起初我按顺序做所有事情,这是最快的: - 遍历树 - 每个节点遍历后代并计算 descendantCount 和 modifyCount
在对 BlockingQueues 使用流水线方法后,性能似乎有所下降,但我实际上没有进行任何时间测量,我必须恢复许多更改才能返回 :( 也许随着 CPU 的增加性能会提高,因为我只有一个Core2Duo 现在用于测试。
最好的问候,
约翰内斯
java - Java:尝试将对象添加到 BlockingQueue 时出现 NullPointerException?
我发现了一个关于 PriorityQueue 的类似问题,那个错误是它没有正确初始化。我可能有同样的问题,但我不知道如何正确初始化它!
截至目前,我只是这样做:
阻塞队列 myQueue = null;
但是,一旦我尝试将某些内容添加到列表中,就会引发异常。
如何正确初始化 BlockingQueue?
java - 我是否应该显式唤醒一个吸食 BlockingQueue.take() 的线程以提高性能?
我知道BlockingQueue
使用该take()
方法让线程吸吮 a 的元素将等待一个元素可用(除非它被中断)。
我有两个问题:
i) 线程是否会在元素可用时自动唤醒或是否存在延迟(即线程稍后会检查自身)?
ii)如果有延迟,唤醒线程是否有意义(例如通过显式中断它)?我正在考虑延迟和性能。
java - LinkedBlockingQueue 和原语
我需要一个 LinkedBlockingQueue 但我将原语传递给它。我添加到队列的数据速率约为每秒 4 毫秒或 256 个数据点。我遇到的问题是数据在开始时立即开始延迟,但随着时间的推移,JIT 似乎使这更有效,并且最终实时结束。我试图找出我需要减少初始延迟的地方,其中之一是从队列中每个插入的自动装箱中“更新”一个 Float 对象。有人有使用原语的 LinkedBlockingQueue 吗?
或者当您不确定大小和使用原语时,是否有比 LinkedBlockingQueue 更快的东西?
c++ - C++11 中有并发容器吗?
特别是,我正在寻找一个阻塞队列。C ++ 11中有这样的事情吗?如果没有,我的其他选择是什么?我真的不想再自己下降到线程级别了。太容易出错了。