在没有遇到竞争条件的情况下,在并发程序中从BlockingQueue中获取对象的最佳方法是什么? 我目前正在做以下事情,我不相信这是最好的方法:

BlockingQueue<Violation> vQueue;
/* 
in the constructor I pass in a BlockingQueue object 
full of violations that need to be processed - cut out for brevity
*/

Violation v;
while ( ( v = vQueue.poll(500, TimeUnit.MILLISECONDS) ) != null ) {
    // do stuff with the violation
}

我还没有达到竞争状态......但是,我不确定这是否真的安全。

===============>>#1 票数:6 已采纳

class Producer implements Runnable {
   private final BlockingQueue queue;
   Producer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { queue.put(produce()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   Object produce() { ... }
 }

 class Consumer implements Runnable {
   private final BlockingQueue queue;
   Consumer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { consume(queue.take()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   void consume(Object x) { ... }
 }

 class Setup {
   void main() {
     BlockingQueue q = new SomeQueueImplementation();
     Producer p = new Producer(q);
     Consumer c1 = new Consumer(q);
     Consumer c2 = new Consumer(q);
     new Thread(p).start();
     new Thread(c1).start();
     new Thread(c2).start();
   }
 }

此示例取自BlockingQueueJDK 1.6文档 所以你可以看到你正在以正确的方式做到这一点。 这是引用它告诉你它必须工作的引用:

内存一致性效果:与其他并发集合一样,在将对象放入BlockingQueue之前,线程中的操作发生在从另一个线程中的BlockingQueue访问或删除该元素之后的操作之前。

  ask by Matt Cummings translate from so

未解决问题?本站智能推荐:

3回复

BlockingQueue-仅获取特定对象。

我有以下blockingQueue; 哪里 我有一个将消息放入队列的生产者。 现在我的目标是创建使用者,使其能够仅从队列中提取特定作者的特定消息? 可能吗? 如果不是,那么可以使用什么替代BlockingQueue?
1回复

BlockingQueue的put()和高并发性

我正在使用Fork / Join Framework并行进行大量计算。 我已经用一个简单的记录器实现了Producer-Consumer Pattern,以在程序计算时创建控制台输出。 生产者和消费者共享一个BlockingQueue并且我使用put()方法,所以我不会错过任何更新。
5回复

BlockingQueue - 阻止drainTo()方法

BlockingQueue有一个名为drainTo()的方法,但它没有被阻止。 我需要一个我想阻止的队列,但也能够在一个方法中检索排队的对象。 我想上面的代码会起作用,但我正在寻找一个优雅的解决方案。
1回复

Java中BlockingQueue的异步等效性?

我正在寻找一个与java.util.concurrent.BlockingQueue等效的异步(非阻塞)队列。 它的界面包括: 如果那很重要,则应该只有一个轮询线程,并且轮询应按顺序进行( poll已经进行时将不调用轮询)。 我希望它已经存在于JVM中,但是我找不到它,当然,我宁
3回复

BlockingQueue中的take()和put()实现

我了解BlockingQueue的理论和概念,但是当我查看LinkedBlockingQueue的实现时 。 我不明白为什么我们使用while循环继续尝试并在take()方法的第8行中等待(与put()相同)。 我认为if检查就足够了,因为从put()调用的signalNotEmpty()仅
3回复

Java中是否有BlockingMap作为BlockingQueue?

我想拥有一个与BlockingQueue非常相似的BlockingMap数据结构。 BlockingQueue的take方法将在那里等待,直到元素可用。 我希望BlockingMap的get方法在那里等待,直到相应的键可用为止? 我可以使用这种数据结构吗?
1回复

确保并发对象调用而不锁定的最佳方法是什么

我有以下对象: 这种方法可能具有一个竞争条件,其中一个线程执行isActive()而另一线程执行load() 。 尽管它在参考上运行并且对象状态未更改。 支持此类并发的最佳解决方案是什么? 我想避免方法同步,也避免读写锁定。 也许是AtomicReference或vola
1回复

选择最佳并发方法

我有两个单独的服务。 我从第一服务获得字符串列表-大约700个值。 然后我过滤此列表并获得100个字符串。 然后,我编写了包含10个字符串的小型查询,并将它们同步发送到第二个服务。 当我从第二个服务获得响应时(当前所有操作都是同步完成的-我等待第二个服务返回响应时)作为另一个字符串列
1回复

解决并发问题的最佳方法

我有一个Person ,我想填充。 由于数据是通过DB调用提供的,因此许多setter方法需要花费一些时间来填充,而返回这些数据可能需要一些时间(超过10秒)。 我正在寻找最好的方法来异步填充变量,然后将我的Person返回到调用方法。 这是一个例子: 我希望能够异步运行我
5回复

BlockingQueue的take()方法的延迟是多少?

我想了解take()是如何工作的,以及它是否是一种合适的方法来消耗在队列中推送的“快速”元素。 请注意,为了理解它是如何工作的,我不会在这里考虑观察者模式:我知道我可以使用该模式对事件“快速反应”,但这不是我的问题所在。 例如,如果我有一个BlockingQueue (大部分是空的)