RxJava:使用SubscribeOn使程序退出而不完成

RxJava:使用SubscribeOn使程序退出而不完成,java,rx-java,reactive-programming,rx-java2,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")); 我的剂量测定方法是 pu

这是我的示例代码

Observable.range(1,5)
            .subscribeOn(Schedulers.computation())
            .map(Observables05::doSomething)
            .subscribe(System.out::println, Throwable::printStackTrace, () -> System.out.println("done"));
我的剂量测定方法是

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)
,则程序在睡眠时间结束时退出之前工作正常


这是预期的行为吗?为什么?如果不使用
Thread.sleep
,我如何使此代码运行?

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

在退出之前,您需要等待所有需要完成的任务<代码>线程.睡眠(3000)完成简单测试用例的工作


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

如果要测试已编写的代码,请使用

代码如下所示:

TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();

Observable.range(1,5)
        .subscribeOn(Schedulers.computation())
        .map(Observables05::doSomething)
        .subscribe(testSubscriber);

testSubscriber.awaitTerminalEvent(10, TimeUnit.SECONDS);
TestSubscriber TestSubscriber=newtestsubscriber();
可观测范围(1,5)
.subscribeOn(Schedulers.computation())
.map(可观测值05::剂量测量)
.订阅(testSubscriber);
testSubscriber.awaitTerminalEvent(10,时间单位:秒);

请记住,
TestSubscriber
允许您测试的不仅仅是终端事件。

这是预期的行为。当您在
main
方法中执行时,简单的解决方案是在订阅之前使用
toBlocking()
,如下所示-

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

发生这种情况是因为后台线程作为deamons运行吗?