使用Scheduler时,System.out.println在RxJava中不打印任何内容

tom*_*ies 2 java multithreading scheduler rx-java

我正在摆弄RxJava和Schedulers.我使用调度程序实现了一个非常简单的流:

Observable.just(1, 2, 3)
      .doOnNext(v -> Thread.currentThread().getName())
      .subscribeOn(Schedulers.newThread())
      .subscribe(v -> System.out.println(v));
Run Code Online (Sandbox Code Playgroud)

上面的示例在控制台中不打印任何内容.

我注意到,当我使用Thread.sleep()阻塞主线程时,System.out.println会输出正确的值 - 1 2 3:

Observable.just(1, 2, 3)
        .doOnNext(v -> Thread.currentThread().getName())
        .subscribeOn(Schedulers.newThread())
        .subscribe(v -> System.out.println(v));

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
Run Code Online (Sandbox Code Playgroud)

有人能帮我理解这种行为吗?

ele*_*ven 10

RXJava使用daemon线程.所以你的应用程序刚刚Observable开始发布之前完成.它很容易检查,只需传递Scheduler返回非daemon线程,你会看到你的输出值:

Scheduler scheduler = Schedulers.from(Executors.newCachedThreadPool(new ThreadFactory() {
    @Override public Thread newThread(Runnable r) {
        Thread result = new Thread(r);
        //result.setDaemon(true);
        return result;
    }
}));

Observable.just(1, 2, 3)
        .subscribeOn(scheduler)
        .subscribe(v -> print(v));
Run Code Online (Sandbox Code Playgroud)

取消注释该行result.setDaemon(true);,不会打印值.