A ordem dos pedidos pode ser qualquer coisa, mas a ordem das regras não deve mudar. Também para uma regra de pedido específica, deve haver um grupo.
Se for esse o caso, não há espaço para o paralelismo real.
Quando
order1-rule1
order1-rule2
order2-rule1
order2-rule2
e
order2-rule1
order2-rule2
order1-rule1
order1-rule2
são as únicas execuções válidas para 2 pedidos e 2 regras,
e
order1-rule1
order2-rule1
order1-rule2
order2-rule2
é considerado inválido, isso não é paralelismo, apenas randomização de orders, presumivelmente sem ganho. Se você está "entediado" com order1a primeira vez o tempo todo, pode embaralhar a lista, mas isso é tudo:
public static void main (String[] args) throws java.lang.Exception
{
List<String> orders = Arrays.asList("order1", "order2", "order3", "order4");
List<String> rules = Arrays.asList("rule1", "rule2", "rule3");
Collections.shuffle(orders);
orders.forEach(order->{
rules.forEach(rule->{
System.out.println(order+"-"+rule);
});
});
}
Nem mesmo o streaming é necessário, apenas dois loops aninhados. Teste: https://ideone.com/qI3dqd
order2-rule1
order2-rule2
order2-rule3
order4-rule1
order4-rule2
order4-rule3
order1-rule1
order1-rule2
order1-rule3
order3-rule1
order3-rule2
order3-rule3
Resposta original
Mas está mudando a ordem rules.forEach (rule -> {}}.
Não, não tem. Os orders podem se sobrepor, mas a ordem de rules para cada pedido é mantida. Por que um não paralelo forEachfaria outra coisa?
Código de exemplo:
public static void main (String[] args) throws java.lang.Exception
{
List<String> orders = Arrays.asList("order1", "order2", "order3", "order4");
List<String> rules = Arrays.asList("rule1", "rule2", "rule3");
orders.stream().parallel().forEach(order->{
rules.forEach(rule->{
System.out.println(order+"-"+rule);
});
});
}
Teste: https://ideone.com/95Cybg
Exemplo de saída:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
A ordem de orders é mista, mas os rulesempre são 1-2-3. Acho que sua saída simplesmente ocultou os pares (na verdade você não mostrou como foi gerada).
É claro que ele pode ser estendido com alguns atrasos, portanto o processamento de orders se sobrepõe:
public static void delay(){
try{
Thread.sleep(ThreadLocalRandom.current().nextInt(100,300));
}catch(Exception ex){}
}
public static void main (String[] args) throws java.lang.Exception
{
List<String> orders = Arrays.asList("order1", "order2", "order3", "order4");
List<String> rules = Arrays.asList("rule1", "rule2", "rule3");
orders.stream().parallel().forEach(order->{
rules.forEach(rule->{
delay();
System.out.println(order+"-"+rule);
});
});
}
Teste: https://ideone.com/cSFaqS
Exemplo de saída:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Isso pode ser algo que você viu, apenas sem a orderxparte. Com os orders visíveis, pode ser rastreado que rulecontinua chegando como 1-2-3, pororder . Além disso, sua lista de exemplos continha order1duas vezes, o que com certeza não ajudou a ver o que estava acontecendo.