L'ordine degli ordini può essere qualsiasi cosa, ma l'ordine delle regole non dovrebbe cambiare. Anche per una particolare regola d'ordine dovrebbe venire in un gruppo.
In tal caso, non c'è spazio per il parallelismo reale.
quando
order1-rule1
order1-rule2
order2-rule1
order2-rule2
e
order2-rule1
order2-rule2
order1-rule1
order1-rule2
sono le uniche corse valide per 2 ordini e 2 regole
e
order1-rule1
order2-rule1
order1-rule2
order2-rule2
è considerato non valido, cioè non parallelismo, solo randomizzazione di order
s, presumibilmente senza guadagno. Se sei "annoiato" di order1
venire sempre per primo, puoi mescolare l'elenco, ma questo è tutto:
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);
});
});
}
Non è nemmeno necessario lo streaming, solo due loop nidificati. Test: 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
Risposta originale
Ma sta cambiando l'ordine rules.forEach (rule -> {}}.
No non lo fa. Le order
s possono sovrapporsi, ma l'ordine di rule
s per ciascun ordine viene mantenuto. Perché un non parallelo dovrebbe forEach
fare qualcos'altro?
Codice di esempio:
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);
});
});
}
Test: https://ideone.com/95Cybg
Esempio di output:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
L'ordine di order
s è misto, ma i rule
s sono sempre 1-2-3. Penso che il tuo output abbia semplicemente nascosto gli accoppiamenti (in realtà non hai mostrato come è stato generato).
Naturalmente può essere esteso con alcuni ritardi, quindi l'elaborazione di order
s si sovrapporrà effettivamente:
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);
});
});
}
Test: https://ideone.com/cSFaqS
Esempio di output:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Questo potrebbe essere qualcosa che hai visto, senza la orderx
parte. Con la order
s visibile può essere rintracciato che rule
continua a venire come 1-2-3, perorder
. Inoltre, la tua lista di esempi conteneva order1
due volte che sicuramente non aiutavano a vedere cosa stava succedendo.