为什么我的 RxJava 计时器应用程序没有终止?
Why doesn't my RxJava timer application terminate?
我有一个使用 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 秒才能让应用程序退出(juat 运行 它并等待)。
顺便说一句,interval()
默认作用于 computation
Scheduler
,您可以使用同样获取 Scheduler
作为参数的重载来覆盖它。
我有一个使用 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 秒才能让应用程序退出(juat 运行 它并等待)。
顺便说一句,interval()
默认作用于 computation
Scheduler
,您可以使用同样获取 Scheduler
作为参数的重载来覆盖它。