tom*_*ies 2 java multithreading scheduler rx-java
我正在摆弄RxJava和Schedulers.我使用调度程序实现了一个非常简单的流:
Observable.just(1, 2, 3)
.doOnNext(v -> Thread.currentThread().getName())
.subscribeOn(Schedulers.newThread())
.subscribe(v -> System.out.println(v));
Run Code Online (Sandbox Code Playgroud)
上面的示例在控制台中不打印任何内容.
我注意到,当我使用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();
}
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解这种行为吗?
ele*_*ven 10
RXJava
使用daemon
线程.所以你的应用程序刚刚Observable
开始发布之前完成.它很容易检查,只需传递Scheduler
返回非daemon
线程,你会看到你的输出值:
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));
Run Code Online (Sandbox Code Playgroud)
取消注释该行result.setDaemon(true);
,不会打印值.