rx-java - Rxjava Schedulers.newThread() 上限

标签 rx-java rx-java2 java-threads

我正在使用 RxJava 和 Spring boot。 现在,对于每个请求,我都会启动 10 个子线程(使用 Schedulers.nextThread())。

我将在生产环境中使用它,我可以在其中并发最多 500 个请求

所以我的问题是 a) 这是好的做法吗? b) 我可以添加要生成的线程数是否有上限? c) 我可以在 Java 中运行多少个并发线程(例如 32GB RAM)?

所以我的情况是,如果我有 500 个并发请求,并且每个请求产生 10 个线程,则总共有 5500 个并发线程。

这个线程数在生产环境中合适吗?

最佳答案

没有充分的理由产生那么多线程。同时可执行的代码片段数量受到您可以访问的 CPU 核心数量的限制。台式机可能有两个或四个核心,而服务器可能有数十个核心。

您需要的是一个由执行器管理的线程池,例如 ScheduledExecutorService。它可以由 Schedulers.from() 包装以创建与 RxJava 一起使用的调度程序。一般来说,您构建的线程池的核心数量不超过两倍。

当您使用 observeOn()subscribeOn() 运算符时,传入的调度程序用于为该观察者链选择单个线程。

如果有 500 个并发请求和 20 核服务器,您一次只能处理不超过 20 个操作,这意味着您必须对要处理的请求进行排队。如果您创建 5,000 或 40 个线程,您仍然一次只能推进 20 个请求。如果您创建 5,000 个线程,您将要求执行器处理排队;如果您创建 40 个线程,则队列将在 RxJava 代码中处理。

关于rx-java - Rxjava Schedulers.newThread() 上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671090/

相关文章:

java - 先前完成后添加新订阅

java - 简化交错的 flatMap Observables 链

java - RXJava 停止在平面图中可观察

java - java多线程程序中的Volatile变量

java - Java 线程长时间在无限循环中运行的场景被 JVM 终止

java - RxJava轮询+手动刷新

java - 将 Single 应用于 ObservableSource 并且不要过度读取

android - 将 Single<Boolean> 转换为 Boolean (Kotlin)

android - 存储从 web 服务获取的数据后,在 RxJava 中返回订阅者

java - Java 中的 "implements Runnable"与 "extends Thread"