Ничто в документации не говорит о том, что порядок вызова имеет значение для thenCompose
.
Поскольку вы определяете две независимые стадии, обе только в зависимости от completableFuture
, не существует определенного порядок между users1
и user2
, и результирующий порядок зависит только от реализации.
Вы можете воспроизводимо получить определенный заказ в одной среде, но другой порядок в другой среде. Даже в вашей среде можно получить другой заказ в некоторых сериях. Если инициирующий поток теряет ЦП после вызова supplyAsync(supplyIds)
в течение 200 миллисекунд, он может выполнить действие, указанное с помощью thenCompose(fetchUsers1)
, непосредственно при вызове, до вызова thenCompose(fetchUsers2)
.
Когда порядок между двумя действия имеют значение, вы должны смоделировать зависимость между ними.
Обратите внимание, что аналогичным образом код
users1.thenRun(()-> System.out.println("User 1"));
users2.thenRun(()-> System.out.println("User 2"));
users1.acceptEither(users2, displayer);
определяет полностью независимые действия. Поскольку acceptEither
применяется к users1
и users2
, а не к этапам завершения, возвращаемым вызовами thenRun
, он не зависит от завершения операторов печати. Эти три действия могут быть выполнены в любом порядке.