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

标签 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.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 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); 并且不会打印值。

关于java - 使用 Schedulers 时,System.out.println 在 RxJava 中不打印任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35234211/

相关文章:

java - LibGdx设置背景图片(响应式)

c++ - 将附加参数包装到 c++11 中的可变参数包

jquery - 如何自定义 Kendo Scheduler Week View?

python - 简单的闹钟和每秒检查时间

python - 如何在一项任务中运行 dag

java - 并行多播路由(末尾带有 POST)

java - EJB 客户端找不到在 WebLogic 管理控制台中测试成功的数据源

java - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 不工作

java - 如何将主函数中的变量同步到新线程?

c# - 从 BackgroundWorker 转向日志类的 TPL