如何通过多个线程迭代concurrentLinkedQueue?

时间:2017-07-24 22:20:10

标签: java multithreading concurrency

在我的应用程序中,数据生成速度(存储在concurrentLinkedQueue中)大于单线程可以使用的数据。

我决定从创建4个线程开始使用数据,以防止我的应用程序出现内存异常"。

问题:

  • 上述问题的其他更好的设计是什么?
  • 我们可以使用多个线程迭代concurrentLinkedQueue并在迭代时删除元素吗?
  

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

2 个答案:

答案 0 :(得分:1)

您应该在offer上使用pollConcurrentLinkedQueue方法,而不是直接使用迭代器。迭代器是weakly consistent

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

许多线程可以安全地同时调用offer和/或poll

答案 1 :(得分:1)

我认为你不应该迭代,而是从队列中创建每个轮询数据的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();
    }