簡體   English   中英

如何通過多個線程迭代 concurrentLinkedQueue?

[英]How to iterate on concurrentLinkedQueue by multiple threads?

在我的應用程序中,數據生成速度(存儲在 concurrentLinkedQueue 中)大於我可以使用單線程消耗的速度。

我決定從創建 4 個線程來使用數據開始,以防止我的應用程序出現“內存不足異常”。

問題:

  • 對於上述問題,還有其他更好的設計示例嗎?
  • 我們可以用多個線程迭代 concurrentLinkedQueue 並在迭代時刪除元素嗎?

內存一致性影響:與其他並發集合一樣,在將對象放入 ConcurrentLinkedQueue 之前線程中的操作發生在另一個線程中從 ConcurrentLinkedQueue 訪問或刪除該元素之后的操作之前。

我認為你不應該迭代而是創建 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();
    }

您應該在ConcurrentLinkedQueue上使用offerpoll方法,而不是直接使用迭代器。 迭代器是弱一致的

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

許多線程同時調用offer和/或poll是安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM