这两段代码的输出顺序不同。 第一段:
while(!jobQueue.isEmpty()) {
TimeoutJobRequest job = jobQueue.peek();
if(job.isReady()) {
execute(job);
jobQueue.poll();
} else {
return;
}
}
第二篇:
jobQueue.stream()
.filter(TimeoutJobRequest::isReady)
.peek(jobQueue::remove)
.forEach(this::execute);
注意 jobQueue
是一个 PriorityBlockingQueue
。
只有当 this::execute
相对较长时(比如几秒钟)才会重新排序。
最佳答案
PriorityBlockingQueue
的stream
遵循Iterator
顺序,根据documentation :
The Iterator provided in method iterator() is not guaranteed to traverse the elements of the PriorityBlockingQueue in any particular order.
如果你想要优先顺序,你需要从 PriorityBlockingQueue
中poll
元素。
PriorityBlockingQueue<Integer> pq = new PriorityBlockingQueue<>();
pq.add(5);
pq.add(8);
pq.add(3);
System.out.println("-- Try 1 --");
pq.stream().forEach(System.out::println);
System.out.println("-- Try 2 --");
IntStream.range(0, pq.size()).map(i -> pq.poll()).forEach(System.out::println);
输出(可能取决于 Java 实现):
-- Try 1 --
3
8
5
-- Try 2 --
3
5
8
关于java - Java 8 中的 PriorityBlockingQueue 流乱序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31798968/