Kolejność zamówień może być dowolna, ale kolejność reguł nie powinna się zmieniać. Również dla konkretnego zamówienia reguła powinna przychodzić w grupie.
W takim przypadku nie ma miejsca na faktyczną równoległość.
Kiedy
order1-rule1
order1-rule2
order2-rule1
order2-rule2
i
order2-rule1
order2-rule2
order1-rule1
order1-rule2
są jedynymi prawidłowymi przebiegami dla 2 zamówień i 2 reguł,
oraz
order1-rule1
order2-rule1
order1-rule2
order2-rule2
jest uważany za nieważny, to nie jest paralelizm, tylko randomizacja order
s, prawdopodobnie bez wzmocnienia. Jeśli „nudzi cię” ciągłe order1
zajmowanie pierwszego miejsca, możesz przetasować listę, ale to wszystko:
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);
});
});
}
Nawet transmisja strumieniowa nie jest konieczna, tylko dwie zagnieżdżone pętle. 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
Oryginalna odpowiedź
Ale zmienia reguły. Dla każdego (zasada -> {}} kolejność.
Nie. W order
y mogą zachodzić na siebie, a kolejność rule
S dla każdego rzędu są przechowywane. Dlaczego nierównoległość miałaby forEach
robić cokolwiek innego?
Przykładowy kod:
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
Przykładowy wynik:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
Kolejność order
s jest mieszana, ale rule
s są zawsze 1-2-3. Myślę, że twój wynik po prostu ukrył pary (w rzeczywistości nie pokazałeś, jak został wygenerowany).
Oczywiście można go rozszerzyć z pewnymi opóźnieniami, więc przetwarzanie order
s faktycznie się nakłada:
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
Przykładowy wynik:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
To może być coś, co widziałeś, tylko bez tej orderx
części. Z order
widocznymi s można śledzić, że rule
ciągle pojawiają się jako 1-2-3, naorder
. Ponadto twoja przykładowa lista zawierała order1
dwa razy, co z pewnością nie pomogło zobaczyć, co się dzieje.