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

for*_*t17 1 java concurrency multithreading

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

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

问题 :

  • 对于上述问题,还有其他更好的设计吗?
  • 我们可以用多个线程迭代 concurrentLinkedQueue 并在迭代时删除元素吗?

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

Sam*_*ers 5

我认为你不应该迭代而是创建 4 个线程,每个轮询队列中的数据,以便轮询的数据将被删除或换句话说被消耗

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

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

                // do something with element
                // here
            }
        }).start();
    }
Run Code Online (Sandbox Code Playgroud)