may*_*sht 8 java multithreading java-8 java-stream
我正在尝试在订单级别使用多线程处理以下代码。
List<String> orders = Arrays.asList("order1", "order2",
"order3", "order4", "order1");
Run Code Online (Sandbox Code Playgroud)
当前顺序执行:
orders.stream().forEach(order -> {
rules.forEach(rule -> {
finalList.add(beanMapper.getBean(rule)
.applyRule(createTemplate.apply(getMetaData.apply(rule), command),
order));
});
});
Run Code Online (Sandbox Code Playgroud)
我试过使用:
orders.parallelStream().forEach(order -> {}} // code snippet.
Run Code Online (Sandbox Code Playgroud)
但它正在改变rules.forEach(rule -> {}}顺序。
例如:
输入:
List<String> orders = Arrays.asList("order1", "order2",
"order3", "order4", "order1");
List<String> rules = Arrays.asList("rule1", "rule2", "rule3");
Run Code Online (Sandbox Code Playgroud)
预期输出:
order1 with rule1, rule2, rule3
order2 with rule1, rule2, rule3
Run Code Online (Sandbox Code Playgroud)
实际输出parallelStream():
order1 with rule3, rule1, rule2
order1 with rule2, rule1, rule3
Run Code Online (Sandbox Code Playgroud)
我不担心命令的顺序,但我担心规则的顺序。订单可以按任何顺序处理,但规则应按每个订单的相同顺序执行。
请帮忙。
您可以使用 :
orders.stream().parallel().forEachOrdered(// Your rules logic goes here. )
Run Code Online (Sandbox Code Playgroud)
ForEachOrdered 保证维持 Stream 的顺序。
所以供你参考:
orders.stream().parallel().forEachOrdered( order -> {
rules.stream().parallel().forEachOrdered ( rule -> {
System.out.println( " Order : " + order + " rule :" + rule);
});
});
Run Code Online (Sandbox Code Playgroud)
注意:虽然我们可以做到这一点,但应该密切关注性能,因为并行性和顺序性不能很好地结合在一起!
输出
Order : order1 rule :rule1
Order : order1 rule :rule2
Order : order1 rule :rule3
Order : order2 rule :rule1
Order : order2 rule :rule2
Order : order2 rule :rule3
Order : order3 rule :rule1
Order : order3 rule :rule2
Order : order3 rule :rule3
Order : order4 rule :rule1
Order : order4 rule :rule2
Order : order4 rule :rule3
Order : order1 rule :rule1
Order : order1 rule :rule2
Order : order1 rule :rule3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |