我有一个使用 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
完成后终止?
最佳答案
该问题与 RxJava
无关,而是与 Executors.newCachedThreadPool()
有关,根据 JVM 规范,控制台应用程序将不会退出,直到所有非守护线程已执行完毕。 (或显式调用 System.exit()
)。
现在 newCachedThreadPool 执行器将线程保留在缓存中以供将来使用,并且仅在 60 秒不使用后才会关闭线程(请参阅文档),所以这里发生的是 RxJava 使用此缓存中的线程然后在发出所有项目后,您需要等待 60 秒应用程序退出(只需运行它并等待)。
顺便说一下,interval()
默认作用于 computation
Scheduler
,您可以使用也获取 的重载来覆盖它Scheduler
作为参数。
关于java - 为什么我的 RxJava 计时器应用程序不终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44178879/