RxJava Schedulers.io не работает в проекте Maven - PullRequest
0 голосов
/ 08 декабря 2018

Я создал проект maven в Intellij IDEA, я пытаюсь выполнить приведенный ниже простой код rxjava

Observable.just(1,2,3,4)
          .observeOn(Schedulers.io())
          .subscribe(new Consumer<Integer>() {
              @Override
              public void accept(Integer integer) throws Exception {
                  System.out.println(integer);
              }
         });

Я ожидаю, что результат 1 , 2 , 3 , 4 будет напечатан в потоке io.Но когда я запускаю код, он ничего не печатает.Если я удаляю observeOn(Schedulers.io), то он печатается, как и ожидалось, в главном потоке.Я создал создание пользовательского пула потоков, как показано ниже

Executor executor = Executors.newFixedThreadPool(1);
Observable.just(1,2,3,4)
    .observeOn(Schedulers.from(executor))
    .subscribe(new Consumer<Integer>() {
        @Override
        public void accept(Integer integer) throws Exception {
            System.out.println(integer);
        }
    });

Это работает правильно.Потоки Schedulers.newThread() и Schedulers.computation() также работают правильно.Только Schedulers.io не влияет на код.Почему это так?

Ниже моя зависимость от Rxjava

  <dependency>
        <groupId>io.reactivex.rxjava2</groupId>
        <artifactId>rxjava</artifactId>
        <version>2.2.4</version>
    </dependency>

1 Ответ

0 голосов
/ 08 декабря 2018

В планировщиках RxJava Schedulers.io() используются потоки демона.

Поток демона - это поток, который не препятствует выходу JVM по завершении программы, но поток все еще работает.Примером потока демона является сборщик мусора.

source

В вашем первом примере основной метод завершается, и программа завершается, так что вы нене вижу выхода.Добавление Thread.sleep() в конце вашего основного метода приведет к задержке выхода, и вы должны увидеть вывод.

Я предполагаю, что Executors.newFixedThreadPool(1) не использует потоки deamon, поэтому он блокирует основной метод отвыход и вы видите другой вывод.

...