Порядок замовлень може бути будь-яким, але порядок правил не повинен змінюватися. Також для певного правила замовлення слід надходити в групі.
Якщо це так, немає місця для фактичного паралелізму.
Коли
order1-rule1
order1-rule2
order2-rule1
order2-rule2
і
order2-rule1
order2-rule2
order1-rule1
order1-rule2
є єдиними дійсними пробіжками для 2 замовлень та 2 правил,
і
order1-rule1
order2-rule1
order1-rule2
order2-rule2
вважається недійсним, тобто не паралелізм, а просто рандомізація orders, імовірно, без виграшу. Якщо вам "нудно", коли ви order1прийдете спочатку весь час, ви можете перетасувати список, але це все:
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);
});
});
}
Навіть не потрібно потокове передавання, просто дві вкладені петлі. Тест: 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
Оригінальна відповідь
Але це змінює правила.forEach (правило -> {}} порядок.
Ні, це не є. В orderи можуть перекривати один одного, але порядок ruleз для кожного замовлення зберігаються. Чому б непаралель forEachробив щось інше?
Приклад коду:
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);
});
});
}
Тест: https://ideone.com/95Cybg
Приклад виведення:
order2-rule1
order2-rule2
order2-rule3
order1-rule1
order1-rule2
order1-rule3
order4-rule1
order4-rule2
order4-rule3
order3-rule1
order3-rule2
order3-rule3
Порядок orders змішаний, але rules завжди 1-2-3. Я думаю, що ваш результат просто приховав пар (насправді ви не показали, як це генерується).
Звичайно, його можна продовжити з деякими затримками, тому обробка orders фактично перекриється:
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);
});
});
}
Тест: https://ideone.com/cSFaqS
Приклад виведення:
order3-rule1
order2-rule1
order2-rule2
order3-rule2
order3-rule3
order2-rule3
order1-rule1
order4-rule1
order1-rule2
order4-rule2
order4-rule3
order1-rule3
Це може бути те, що ви бачили, тільки без orderxчастини. З orderвидимим s можна відстежити, що ruleпродовжують надходити як 1-2-3, заorder . Також ваш список прикладів містив order1двічі, що точно не допомогло побачити, що відбувається.