java - 如何在 JAVA 8 中处理嵌套的对象列表 - 顺序处理内部列表,而外部列表必须并行处理
问题描述
我正在尝试解决以下情况:我有一个嵌套的自定义对象列表。我必须并行处理外部列表,但必须按顺序处理内部列表对象。我尝试了外部列表的 list.parallelstream() 和内部列表的 list.stream() 但它不起作用,内部列表值在执行期间随机处理。我想过使用 Thread (ExecutorService),但不确定如何开始。下面是 paraalalStream 的代码片段:
处理列表的代码:
List<List<MyObject>> masterList = getMasterList();
masterList.parallelStream().forEach(innerList -> printSubList(innerList));
填充列表的代码:
private static List<List<MyObject>> getMasterList() {
MyObject myObject1 = new MyObject(1,"ABC-1");
MyObject myObject2 = new MyObject(2,"ABC-2");
MyObject myObject3 = new MyObject(3,"ABC-3");
MyObject myObject4 = new MyObject(1,"XYZ-1");
MyObject myObject5 = new MyObject(2,"XYZ-2");
List<MyObject> innerList1 = new ArrayList<>();
innerList1.add(myObject1);
innerList1.add(myObject2);
innerList1.add(myObject3);
List<MyObject> innerList2 = new ArrayList<>();
innerList2.add(myObject4);
innerList2.add(myObject5);
List<List<MyObject>> masterList = new ArrayList<>();
masterList.add(innerList1);
masterList.add(innerList2);
return masterList;
}
打印要验证的对象:
private static Consumer<? super List<MyObject>> printSubList(List<MyObject> innerList) {
innerList.stream();
for(MyObject myObject : innerList) {
System.out.println("System Time = "+ System.currentTimeMillis()+" = "+myObject.getName()+" "+myObject.getId());
}
return null;
}
我也愿意使用 Thread,但不确定在这种情况下如何使用。非常感谢任何帮助。
这是我当前的输出:
System Time = 1603173228270 = ABC-3 3
System Time = 1603173228271 = XYZ-1 1
System Time = 1603173228272 = ABC-1 1
System Time = 1603173228272 = ABC-2 2
System Time = 1603173228272 = XYZ-2 2
但我希望它是:
System Time = 1603173228270 = ABC-1 1
System Time = 1603173228271 = ABC-2 2
System Time = 1603173228272 = ABC-3 3
System Time = 1603173228270 = XYZ-1 1
System Time = 1603173228271 = XYZ-2 2
解决方案
很高兴回复你。在这种情况下,我认为您的想法在多个线程中是错误的。因为在多线程或Parallelstream中进程的结果不确定,每个线程执行进程可能使用不同的时间。所以我们无法控制过程中的顺序,例外地,我们对它们做了一些逻辑,但这并不容易,而且没有必要。如果你真的想使用多个线程来处理这些数据。您可以尝试按照this.Using Executors.newSingleThreadExecutor。
Thread threadA = new Thread(()->{ System.out.println("A"); });
Thread threadB = new Thread(()->{ System.out.println("B"); });
Thread threadC = new Thread(() -> { System.out.println("C"); });
ExecutorService executors = Executors.newSingleThreadExecutor();
`executors.submit(threadA);
executors.submit(threadB);
executors.submit(threadC);
executors.shutdown();`
// 答案总是 ABC
推荐阅读
- android - 未解决的参考: Parcelable Kotlin
- django - Django 表单给出“str”对象没有属性“_meta”
- regex - 使用正则表达式将日期列转换为列“开始”和“结束”
- django - 如何通过Django中的手机号码重置密码?
- javascript - 更新由空中地图标记空纬度管理的视图的属性坐标时出错
- python - 同时运行 Discord.py 客户端和 Uvicorn 应用程序
- javascript - 如何获得 5 天 / 3 小时预报数据的 Chart JS 天气图
- ipfs - ipfs-http-client 并同时添加到 ipfs mfs?
- r - R:Anova-test (aov)、for-Loop 和 paste 的组合导致错误
- c# - 如何将 ms graph api mime 内容转换为 microsoft.exchange.webservices.data mime 内容 c#