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

时间:2017-05-25 10:59:38

标签: 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);
    });
}

正确打印定时器10次:

0s
1s
2s
3s
4s
5s
6s
7s
8s
9s

但是,应用程序在9s之后不会终止。似乎有一些线程让它保持活力。

我应该如何实现这一点,以便应用程序在ticker完成后终止?

1 个答案:

答案 0 :(得分:6)

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

顺便说一句,interval()默认情况下会computation Scheduler,您可以使用重载来覆盖它,同时将Scheduler作为参数。