我有一个使用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
完成后终止?
答案 0 :(得分:6)
该问题与RxJava
无关,但对于Executors.newCachedThreadPool()
,根据JVM规范,控制台应用程序将不会退出,直到所有非守护程序线程都完成执行。 (或明确地致电System.exit()
)
现在newCachedThreadPool
执行者将一个线程保存在缓存中以供将来使用,并且仅在60秒后才关闭线程(参见文档),所以这里发生的是RxJava使用了一个线程缓存然后在发出所有项目之后,您需要等待60秒才能退出应用程序(juat运行并等待)。
顺便说一句,interval()
默认情况下会computation
Scheduler
,您可以使用重载来覆盖它,同时将Scheduler
作为参数。