sdg*_*sdh 0 java multithreading rx-java rx-java2
我有一个使用RxJava 2的简单应用程序:
public static void main(final String[] args) {
final Scheduler scheduler = Schedulers.from(Executors.newCachedThreadPool());
final Observable<String> ticker = Observable.interval(1L, TimeUnit.SECONDS)
.take(10)
.subscribeOn(scheduler)
.map(x -> x + "s");
ticker.subscribe(x -> {
System.out.println(x);
});
}
Run Code Online (Sandbox Code Playgroud)
它正确打印定时器10次:
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Run Code Online (Sandbox Code Playgroud)
但是,应用程序之后不会终止9s
.似乎有一些线程让它保持活力.
我应该如何实现这一点,以便应用程序在ticker
完成后终止?
这个问题与RxJava
具体问题无关,但是Executors.newCachedThreadPool()
根据JVM规范,控制台应用程序将不会退出,直到所有非守护程序线程都完成执行.(或明确地致电System.exit()
).
现在,newCachedThreadPool
执行程序将一个线程保存在缓存中以供将来使用,并且仅在60秒后才关闭线程(参见文档),所以这里发生的是RxJava使用来自此缓存的线程,然后在所有项目发出之后,需要等待60秒让应用程序退出(juat运行并等待).
顺便说一下,interval()
默认情况下computation
Scheduler
,你可以使用也Scheduler
作为参数获取的重载来覆盖它.