El orden de las órdenes puede ser cualquier cosa, pero el orden de las reglas no debe cambiar. También para una regla de orden particular debe venir en un grupo.
Si ese es el caso, no hay espacio para el paralelismo real.
Cuando
order1-rule1
order1-rule2
order2-rule1
order2-rule2
y
order2-rule1
order2-rule2
order1-rule1
order1-rule2
son las únicas ejecuciones válidas para 2 pedidos y 2 reglas,
y
order1-rule1
order2-rule1
order1-rule2
order2-rule2
se considera inválido, eso no es paralelismo, solo aleatorización de orders, presumiblemente sin ganancia. Si está "aburrido" de order1venir primero todo el tiempo, puede barajar la lista, pero eso es todo:
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);
});
});
}
Ni siquiera es necesaria la transmisión, solo dos bucles anidados. Prueba: 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
Respuesta original
Pero está cambiando las reglas. Para cada orden (regla -> {}}.
No, no lo hace. La orders puede superponerse, pero rulese mantiene el orden de s para cada orden. ¿Por qué un no paralelo forEachharía algo más?
Código de ejemplo:
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);
});
});
}
Prueba: https://ideone.com/95Cybg
Ejemplo de salida:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
El orden de orders es mixto, pero los rules siempre son 1-2-3. Creo que su salida simplemente ocultó los emparejamientos (en realidad no mostró cómo se generó).
Por supuesto, puede extenderse con algunos retrasos, por lo que el procesamiento de orders realmente se superpondrá:
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);
});
});
}
Prueba: https://ideone.com/cSFaqS
Ejemplo de salida:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Esto puede ser algo que has visto, solo que sin la orderxparte. Con los orders visibles, se puede rastrear que rulesiguen llegando como 1-2-3, pororder . Además, su lista de ejemplo contenía order1dos veces, lo que seguro no ayudó a ver lo que estaba sucediendo.