2017-07-24 51 views
0

在我的应用程序数据生成速度(它是存储在concurrentLinkedQueue)大于我可以消耗单线程。如何在多线程上迭代concurrentLinkedQueue?

我决定先创建4个线程来使用数据,以防止我的应用程序出现“内存不足异常”。

问题:

  • 用于与例如上述问题的任何其他更好的设计?
  • 我们可以迭代concurrentLinkedQueue和多个线程,并在迭代时删除元素吗?

内存一致性效果:当存在其他并发集合,事先将对象放入到该元素的在接入 或去除从所述的ConcurrentLinkedQueue之后的 的ConcurrentLinkedQueue发生-前行动在一个线程 动作另一个 线程。

+0

我想看看[阻塞队列(HTTPS:/ /docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html),因为您的消费者线程可能不得不在处理“生产者”时处理这种情况。然后你可以通过发送一些特殊的项目给他们停止线程(4份,所以每个线程将消耗一个) – tevemadar

+0

@tevemadar感谢您的建议:) –

回答

0

我想你不应该重复,但是从队列创建4个线程每个轮询数据,以便调查数据将被删除或者换句话说消耗

// your queue 
ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(); 

    // create 4 Threads 
    for (int i = 0; i < 4; i++) { 
     new Thread(() -> { 
      while (true) { 
       // consume element 
       concurrentLinkedQueue.poll(); 

       // do something with element 
       // here 
      } 
     }).start(); 
    } 
0

您应该使用一个ConcurrentLinkedQueueofferpoll方法,而不是直接使用迭代器。迭代器是weakly consistent

while(true) { 
    final Item item = queue.poll(); 
    if (item == null) { 
    break; 
    } 
    // do something with item 
} 

它是安全的多个线程调用offer和/或poll兼任。

+0

感谢您的答案:), –