使用 `PriorityBlockingQueue` 存儲 10 個元素,遍歷輸出時卻只打印了 5 條記錄:
任務結束
[Event [id=1, priority=1], Event [id=2, priority=2], ...]
10
9
結果:Event [id=1, priority=1]
9
8
結果:Event [id=2, priority=2]
...
6
5
結果:Event [id=5, priority=5]
問題出在這段遍歷代碼:
for (int i = 0; i < queue.size(); i++) {
System.out.println(queue.size());
Event poll = queue.poll(); // 每次 poll 移除一個元素,queue.size() 遞減
System.out.println(queue.size());
System.out.println("結果:" + poll);
}
邏輯缺陷:循環條件 `i < queue.size()` 中,`i` 遞增而 `queue.size()` 遞減。當移除 5 個元素後,`queue.size()` 變為 5,此時 `i` 也為 5,條件不再成立,循環提前結束。
for (int i = queue.size() - 1; i >= 0; i--) {
System.out.println(queue.size());
Event poll = queue.poll();
System.out.println(queue.size());
System.out.println("結果:" + poll);
}
while (queue.size() > 0) {
System.out.println(queue.size());
Event poll = queue.poll();
System.out.println(queue.size());
System.out.println("結果:" + poll);
}
該隊列按優先級排序(自然順序或 Comparator),而非 FIFO。示例中 `Event` 實現 `Comparable`,按 `priority` 升序排列,故輸出順序為 1→10。