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

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)