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运行吗?