首页 > 解决方案 > 如何在 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

标签: javamultithreadinglist

解决方案


很高兴回复你。在这种情况下,我认为您的想法在多个线程中是错误的。因为在多线程或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


推荐阅读