好像你需要某種形式的「暫停」的時刻。一種做法:
AbstractQueue<Object> queue = new ConcurrentLinkedQueue<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
Object object = queue.poll();
if (object == null) {
// Collection has shronk break
break;
}
// Do processing here
}
通過將大小存儲到局部變量中,大小不會改變,您可以使用該大小的元素進行處理。如果在過程元素添加期間,它將不會受到無限循環的影響。
UPDATE:該.iterator()
可能是更好的比我的第一個例子使用:
返回的Iterator是一個「弱一致」的迭代器, 不會拋出ConcurrentModificationException,並且確保 遍歷元件,因爲它們迭代器構造時的存在, 和可以(但不保證)反映任何修改 後續施工。
UPDATE 2:這是將採取的所有元素也被刪除的一次並對其進行處理的方法。
AbstractQueue<Object> queue = new ConcurrentLinkedQueue<>();
queue.add("Test1");
queue.add("Test2");
queue.add("Test3");
Object[] objList = queue.toArray();
queue.remove("Test2");
for (Object obj : objList) {
// Make sure you delete it, because we don't use .poll
// Put it at top, to reproduce the poll as much as possible
queue.remove(obj);
// Do processing
}
這將輸出:
Test1
Test2
Test3
因爲拷貝到新objList[]
它也將顯示 「Test2的」。如果將重複項添加到列表中,此示例可能會導致.remove()
方法出現問題。因爲如果添加的元素與.remove()
中的對象重複,那麼該對象會立即被刪除。
另外請注意,這種方法比較慢,因爲.remove()
需要遍歷元素來找到它O(N1),其中.poll
是即時O(1)。
正是我在找什麼,謝謝! – coolguy