java - RxJava : Using SubscribeOn makes the program exit without completing

标签 java rx-java reactive-programming rx-java2

这是我的示例代码

Observable.range(1,5)
            .subscribeOn(Schedulers.computation())
            .map(Observables05::doSomething)
            .subscribe(System.out::println, Throwable::printStackTrace, () -> System.out.println("done"));

我的 doSomething 方法是,

public static int doSomething(int i) {
    try {
        System.out.println("Processing " + i +
                " on Thread -- " + Thread.currentThread().getName());
        Thread.sleep(500);
        return i;
    } catch (InterruptedException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

仅在主线程中使用示例代码即可退出程序。但是,如果在此之后使用 Thread.sleep(3000) ,则程序在 sleep 时间结束时退出之前可以正常工作。

这是预期的行为吗?为什么?如何在不使用 Thread.sleep 的情况下运行此代码?

最佳答案

subscribeOn 调度对后台线程的 subscribe 调用(您已选择计算调度程序)。在此调度之后,您的主线程可以自由运行,即终止您的程序。

在退出之前,您需要等待所有所需的任务完成。 Thread.sleep(3000) 可以完成简单测试用例的工作。

真实的程序通常不会那么快终止。在某些情况下,您仍然需要等待某些后台任务完成。您可以使用多种线程同步机制(例如CountDownLatch)。

关于java - RxJava : Using SubscribeOn makes the program exit without completing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851752/

相关文章:

java - 发送前查找电子邮件大小

android - LiveDataReactiveStreams : converting Flowable to LiveData doesn't work

java - RxJava中如何同步异步方法? RxJava 中的异步瀑布

c# - 统计一个主题的所有订阅

Java 将图像填充到标签中

java - issueCommand(java.lang.String,int) 在 com.sun.mail.smtp.SMTPTransport 编译错误中具有私有(private)访问权限

java - RxJava : How to unit test that an Observable is observed on and subscribed on the right scheduler?

java - 组间最后值的总和

c# - C# 中的计算数组值 - 响应式(Reactive)编程

java - 如何编写简单的 Hibernate Criteria 子查询