为什么我的RxJava计时器应用程序没有终止?

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完成后终止?

yos*_*riz 6

这个问题与RxJava具体问题无关,但是Executors.newCachedThreadPool()根据JVM规范,控制台应用程序将不会退出,直到所有非守护程序线程都完成执行.(或明确地致电System.exit()).
现在,newCachedThreadPool执行程序将一个线程保存在缓存中以供将来使用,并且仅在60秒后才关闭线程(参见文档),所以这里发生的是RxJava使用来自此缓存的线程,然后在所有项目发出之后,需要等待60秒让应用程序退出(juat运行并等待).

顺便说一下,interval()默认情况下computation Scheduler,你可以使用也Scheduler作为参数获取的重载来覆盖它.