RxJava Schedulers.io在Maven项目中不起作用

时间:2018-12-08 11:48:46

标签: java rx-java rx-java2

我已经在Intellij IDEA中创建了一个maven项目,我正在尝试执行以下简单的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 :(得分:3)

RxJava Schedulers.io()调度程序使用守护线程。

  

守护程序线程是不会阻止JVM退出的线程   当程序完成但线程仍在运行时。一个例子   守护进程线程是垃圾回收。

source

在第一个示例中,main方法完成,并且程序终止,因此您看不到任何输出。在main方法的末尾添加Thread.sleep()将延迟退出,您应该可以看到输出。

我假设Executors.newFixedThreadPool(1)不使用守护进程线程,因此它阻止了main方法的退出,您会看到不同的输出。