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 order
s, presumivelmente sem ganho. Se você está "entediado" com order1
a 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 order
s podem se sobrepor, mas a ordem de rule
s para cada pedido é mantida. Por que um não paralelo forEach
faria 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 order
s é mista, mas os rule
sempre 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 order
s 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 orderx
parte. Com os order
s visíveis, pode ser rastreado que rule
continua chegando como 1-2-3, pororder
. Além disso, sua lista de exemplos continha order1
duas vezes, o que com certeza não ajudou a ver o que estava acontecendo.