Emirlerin sırası herhangi bir şey olabilir, ancak kuralların sırası değişmemelidir. Ayrıca belirli bir düzen için kural bir grup halinde gelmelidir.
Durum buysa, gerçek paralelliğe yer yoktur.
Ne zaman
order1-rule1
order1-rule2
order2-rule1
order2-rule2
ve
order2-rule1
order2-rule2
order1-rule1
order1-rule2
2 sipariş ve 2 kural için geçerli olan tek işlemdir
ve
order1-rule1
order2-rule1
order1-rule2
order2-rule2
geçersiz kabul edilir, bu paralellik değildir, sadece order
s'nin rastgele elde edilmesi , muhtemelen kazanç olmadan. Her zaman order1
ilk gelen "sıkılmış" iseniz, listeyi karıştırabilirsiniz, ama hepsi bu:
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);
});
});
}
Akış bile gerekmez, sadece iki iç içe döngü. 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
Orijinal cevap
Ancak rules.forEach (kural -> {}} sırasını değiştiriyor.
Hayır. order
S çakışabilir, fakat sırası rule
her bir sipariş için s tutulur. Neden paralel forEach
olmayan başka bir şey yapsın ki?
Örnek 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
Örnek çıktı:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
order
S sırası karıştırılır, ancak rule
s daima 1-2-3'tür. Bence çıktılarınız sadece eşleştirmeleri sakladı (aslında nasıl üretildiğini göstermediniz).
Tabii ki bazı gecikmelerle uzatılabilir, bu nedenle order
s'nin işlenmesi aslında örtüşecektir:
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
Örnek çıktı:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Bu, sadece orderx
parçası olmadan gördüğünüz bir şey olabilir . İle order
görünebilir durumda o izlenebilir rule
ler, 1-2-3 gelmeye devam başınaorder
. Ayrıca, örnek listeniz order1
iki kez içeriyordu ve kesin olarak ne olduğunu görmenize yardımcı olmadı.