如何为每个请求项创建多个线程

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)

我不担心命令的顺序,但我担心规则的顺序。订单可以按任何顺序处理,但规则应按每个订单的相同顺序执行。

请帮忙。

Pra*_*kam 4

您可以使用 :

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)