java - Java 8 中的 PriorityBlockingQueue 流乱序

标签 java java-8 java-stream priority-queue

这两段代码的输出顺序不同。 第一段:

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 相对较长时(比如几秒钟)才会重新排序。

最佳答案

PriorityBlockingQueuestream 遵循Iterator 顺序,根据documentation :

The Iterator provided in method iterator() is not guaranteed to traverse the elements of the PriorityBlockingQueue in any particular order.

如果你想要优先顺序,你需要从 PriorityBlockingQueuepoll 元素。

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/

相关文章:

java - PageParameters导致Page的onConfigure被多次调用

java - 将本地时间 (Java 8) 转换为日期

java - 如何对基于 HashMap 值生成字符串的函数进行单元测试?

java - 获取列表中的所有枚举值

java - 合并后以特殊顺序合并 3 个列表(使用 Streams)

java - Android 应用程序在运行时意外停止

java - 如何创建空 map 并设置默认值

java - 当 API 说接口(interface)的方法返回某些内容时,它是什么意思?

java - 用户输入错误,不抛出异常或使用 try{}catch{}

Java 8 和 Java 时间