java - 为什么我的 RxJava 计时器应用程序不终止?

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

最佳答案

该问题与 RxJava 无关,而是与 Executors.newCachedThreadPool() 有关,根据 JVM 规范,控制台应用程序将不会退出,直到所有非守护线程已执行完毕。 (或显式调用 System.exit())。
现在 newCachedThreadPool 执行器将线程保留在缓存中以供将来使用,并且仅在 60 秒不使用后才会关闭线程(请参阅文档),所以这里发生的是 RxJava 使用此缓存中的线程然后在发出所有项目后,您需要等待 60 秒应用程序退出(只需运行它并等待)。

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

关于java - 为什么我的 RxJava 计时器应用程序不终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44178879/

相关文章:

java - 使用 InsertionSort 算法对其中包含空元素的字符串数组进行排序

android - Rxjava 对象过滤列表

java - JMS 可以做什么而 REST 不能做什么

java - 在 Linux 上运行 selenium WebDriver jar 时出错(在 Windows 上工作正常)

Java和线程安全

c++ - 主线程是否在阻塞线程上运行?

java - 线程和 GUI 显示

android - Realm:使用 Clean-Architecture 和 RxJava2

android - 在 Retrofit 2 上使用 RxJavaCallAdapterFactory 时出现 AbstractMethodError

java - 为什么Java提供了LockSupport却没有什么用