![](/img/trans.png)
[英]Concurrency Issue with ConcurrentLinkedQueue with multiple threads writing and multiple threads reading. #Fast directory scan
[英]How to iterate on concurrentLinkedQueue by multiple threads?
在我的應用程序中,數據生成速度(存儲在 concurrentLinkedQueue 中)大於我可以使用單線程消耗的速度。
我決定從創建 4 個線程來使用數據開始,以防止我的應用程序出現“內存不足異常”。
問題:
內存一致性影響:與其他並發集合一樣,在將對象放入 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
上使用offer
和poll
方法,而不是直接使用迭代器。 迭代器是弱一致的。
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.