这是我的示例代码
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/