如何确保并行流中的处理顺序?

问题描述 投票:0回答:1

我想确保基于某些字段值的并行流中的顺序。也许我将介绍一些抽象的例子:

假设我们有班级用户

@Lombok.Data()
class User {
   private String firstName;
   private String lastName;
   private int someValue;
   private int priority;
}

并且我们有这些用户的列表:

List<User> users = someInitUsersFunction();

我想强制并行流按优先级处理每个用户,比方说,我们有100个具有0优先级的用户,100个具有1个优先级的用户和100个具有2个优先级的用户。

仅当优先级为1且优先级为0时,我才想以优先级2启动进程用户。

我认为

MVN安装-T 4

可能是我正在寻找的方法(第一个构建独立模块)。是否可以在Java流中执行此操作?也可以使用替代方法。

我的方法是按优先级划分到特定列表,然后按列表处理列表

java parallel-processing stream java-stream
1个回答
0
投票

[Sequential vs parallelordering不同。

[如果您有一个有序的流,并执行一些保证维持顺序的操作,则以并行还是顺序处理该流并不重要;实现必须保持顺序。

在您的情况下,您可以使用特定的Comparator或让UserComparable字段中实现priority。然后对列表进行排序,然后再执行其他流操作。

或使用特定的集合类型,例如SortedSetPriorityQueue

关于PriorityQueue的某些注意事项,不能保证方法iterator()中提供的Iterator以任何特定顺序遍历PriorityBlockingQueue的元素。

因此,您必须在流式传输期间对元素进行排序以保持顺序-> stream().sorted()或仅在其上使用poll方法。

© www.soinside.com 2019 - 2024. All rights reserved.