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

使用调度器时,System.out.println在RxJava中不打印任何内容,java,multithreading,scheduler,rx-java,Java,Multithreading,Scheduler,Rx Java,我在摆弄RxJava和调度器。我用调度器实现了一个非常简单的流: Observable.just(1, 2, 3) .doOnNext(v -> Thread.currentThread().getName()) .subscribeOn(Schedulers.newThread()) .subscribe(v -> System.out.println(v)); 上面的示例在控制台中不打印任何内容 我注意到,当我在末尾使用thread.slee

我在摆弄RxJava和调度器。我用调度器实现了一个非常简单的流:

Observable.just(1, 2, 3)
      .doOnNext(v -> Thread.currentThread().getName())
      .subscribeOn(Schedulers.newThread())
      .subscribe(v -> System.out.println(v));
上面的示例在控制台中不打印任何内容

我注意到,当我在末尾使用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();
        }

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

RXJava
使用
daemon
线程。所以你的应用程序在你的
Observable
开始发射之前就完成了。很容易检查,只需传递
调度程序
,它返回非
守护进程
线程,您将看到您的输出值:

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));
取消注释行
result.setDaemon(true)和值将不会打印