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 order
s, presumiblemente sin ganancia. Si está "aburrido" de order1
venir 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 order
s puede superponerse, pero rule
se mantiene el orden de s para cada orden. ¿Por qué un no paralelo forEach
harí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 order
s es mixto, pero los rule
s 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 order
s 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 orderx
parte. Con los order
s visibles, se puede rastrear que rule
siguen llegando como 1-2-3, pororder
. Además, su lista de ejemplo contenía order1
dos veces, lo que seguro no ayudó a ver lo que estaba sucediendo.