【发布时间】:2020-01-25 07:42:28
【问题描述】:
我使用的是普通的 JDK 8。我有这个简单的 RxJava 示例:
Observable
.from(Arrays.asList("one", "two", "three"))
.doOnNext(word -> System.out.printf("%s uses thread %s%n", word, Thread.currentThread().getName()))
//.subscribeOn(Schedulers.newThread())
.subscribe(word -> System.out.println(word));
它逐行打印出单词,与线程相关的信息交织在一起,正如预期的那样,这是所有下一次调用的“主要”。
但是,当我取消注释 subscribeOn(Schedulers.newThread()) 调用时,根本没有打印任何内容。为什么它不起作用?我本来希望它为每个onNext() 调用和doOnNext() 启动一个新线程以打印该线程的名称。现在,我什么也看不到,其他调度程序也是如此。
当我在 main 的末尾添加对 Thread.sleep(10000L) 的调用时,我可以看到输出,这表明 RxJava 使用的线程都是守护进程。是这样吗?这是否可以通过某种方式进行更改,但使用自定义 ThreadFactory 或类似概念,而不必实现自定义调度程序?
通过上述更改,线程名称始终为RxNewThreadScheduler-1,而newThread 的文档显示“为每个工作单元创建一个新{@link Thread} 的调度程序”。不是应该为所有排放创建一个新线程吗?
【问题讨论】:
-
你是对的,所有
RxJava线程默认都是守护进程。您可以通过提供自定义RxJavaSchedulersHook来覆盖此行为 -
使用钩子我仍然需要提供一个成熟的调度器实现。我实际上可以不用钩子,只需将我自己的调度程序传递给 subscribeOn 方法。使用钩子我可以全局更改 Schedulers.io() 等方法返回的内容,但我不需要这个。不过还是谢谢。