我已经在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>
答案 0 :(得分:3)
RxJava Schedulers.io()
调度程序使用守护线程。
守护程序线程是不会阻止JVM退出的线程 当程序完成但线程仍在运行时。一个例子 守护进程线程是垃圾回收。
在第一个示例中,main方法完成,并且程序终止,因此您看不到任何输出。在main方法的末尾添加Thread.sleep()
将延迟退出,您应该可以看到输出。
我假设Executors.newFixedThreadPool(1)
不使用守护进程线程,因此它阻止了main方法的退出,您会看到不同的输出。