При выполнении этого кода в основном, это хорошая демонстрация асинхронной природы вещей. Операция выполняется в потоке из планировщика elasti c, и подписка запускает асинхронную обработку, поэтому она немедленно возвращается.
Существует два способа синхронизации конца приложения с концом Flux
:
напечатайте в doOnNext
и используйте blockLast()
Блочные * методы обычно используются в основном и тестах, где нет другого выбора, кроме как вернуться назад к блокирующей модели (ie, потому что в противном случае тест / main завершился бы до окончания обработки).
Мы переключаем «побочный эффект» печати каждого испускаемого элемента в doOnNext
, что посвященный такого рода случаях использования. Затем мы блокируем до завершения потока, печатая blockLast()
.
Flux.range(0, 1000000)
.parallel()
.runOn(Schedulers.elastic())
.sequential()
.count()
.doOnNext(System.out::println)
.blockLast();
в subscribe
и используем CountDownLatch
в doFinally
Это немного более замысловато, но позволяет вам на самом деле использовать подписку, если вы хотите изучить, как работает этот метод.
Мы просто добавляем doFinally
, который срабатывает при любом сигнале завершения (отмена, ошибка или завершение). Мы используем CountDownLatch
для блокировки основного потока, который будет асинхронно отсчитываться изнутри doFinally
.
CountDownLatch latch = new CountDownLatch(1);
Flux.range(0, 1000000)
.parallel()
.runOn(Schedulers.elastic())
.sequential()
.count()
.doFinally(signal -> latch.countDown())
.subscribe(System.out::println);
latch.await(10, TimeUnit.SECONDS);