当前位置: 首页 > 知识库问答 >
问题:

RxJava.subscribeon(Schedulers.NewThread())问题

易阳朔
2023-03-14
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));

它会逐行打印出单词,并与线程的相关信息交织在一起,如预期的那样,线程对于所有下一次调用都是“main”。

但是,当我取消对subscribeON(Schedulers.newThread())调用的注释时,根本不会打印任何内容。为什么不起作用?我希望它为每个onNext()调用启动一个新线程,并通过doonNext()打印该线程的名称。现在,我什么也没看到,其他的调度者也一样。

当我将调用添加到main末尾的thread.sleep(10000L)时,我可以看到输出,这表明RxJava使用的线程都是守护进程。事实是这样的吗?这是否可以改变,但使用自定义ThreadFactory或类似的概念,而不必实现自定义调度器?

通过上述更改,线程名称始终为rxNewThreadScheduler-1,而newThread的文档表示“为每个工作单元创建新的{@link thread}的调度程序”。它不是应该为所有的排放创建一个新线程吗?

共有1个答案

漆雕宏浚
2023-03-14

正如Vladimir提到的,RxJava标准调度程序在守护进程线程上运行工作,在您的示例中,守护进程线程由于主线程退出而终止。我想强调的是,他们不是在一个新线程上调度每个值,而是在一个新创建的线程上为每个单独的订阅者调度值流。第二次订阅将得到“rxNewThreadScheduler-2”。

您实际上不需要更改默认的调度器,只需用schedulers.from()包装您自己的基于执行器的调度器,并在需要的地方提供它作为参数:

ThreadPoolExecutor exec = new ThreadPoolExecutor(
        0, 64, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
exec.allowCoreThreadTimeOut(true);

Scheduler s = Schedulers.from(exec);

Observable
.from(Arrays.asList("one", "two", "three"))
.doOnNext(word -> System.out.printf("%s uses thread %s%n", word,
    Thread.currentThread().getName()))
.subscribeOn(s)
.subscribe(word -> System.out.println(word));

我有一系列关于RxJava调度器的博客文章,它们将帮助您实现一个“更永久”的变体。

 类似资料:
  • 我使用RxJava与Spring Boot。现在对于每个请求,我启动一个说10个子线程(使用Schedulers.nextThread())。 我将在production env中使用它,在那里我可以有多达500个并发请求 所以我的问题是a)这是一种良好的做法吗。b) 我可以为要生成的线程数量添加任何上限吗?c) 我可以在Java中运行多少并发线程(比如32GB RAM)? 所以在我的案例中,如果

  • 在网络请求中使用和有什么好处。我见过许多使用的示例,但我想明白为什么。 示例情形: 为每个工作单元创建一个新线程。将使用线程池 但这种争论对应用程序有什么影响呢?还有哪些方面?

  • 问题内容: 包括: all Spring libs, Apache Tomcat 7.0 library 在构建路径中 但它仍然给出错误: 在“ org.sprintframework.web-3.1.0.M1.jar”中,我可以看到“ org.springframework.web.context.ContextLoaderListener”。 Google上的某个人说应该包含spring.ja

  • 问题内容: 我使用非常简单的代码返回XML 但是,出现以下错误 请帮忙。谢谢 问题答案: 运行时出现NoSuchMethodError表示你使用的库版本与生成代码所针对的版本不同。 在你的情况下,Spring是元凶。在运行时检查类路径上的内容,并确保以下各项: 版本与编译时间罐相同 如果存在多个版本,请删除不需要的版本

  • 问题内容: 我不明白注释和之间的实际区别是什么? 扩展名还是它们具有完全不同的含义?什么时候应该使用它们?在服务层中使用Spring ,在DAO 中使用javax? 谢谢回答。 问题答案: 几年前,Spring定义了自己的Transactional注释以使Spring bean方法具有事务性。 Java EE 7终于做了同样的事情,现在除了EJB方法外,还允许CDI bean方法是事务性的。因此,

  • 我在CentOS虚拟机中安装了RabbitMQ,该虚拟机的网络适配器被定义为Bridge。我正在尝试配置RabbitMQ管理,以便通过机器的IP地址访问WebApp。配置如下: