Schedulers.elastic() 不使用早期生成的线程

Schedulers.elastic() not using early generated threads

我在 spring-boot-2.0 上编写了网络服务器,它在后台使用 netty。 此应用程序使用 Schedulers.elastic() 线程。

启动时创建了大约100个弹性线程。这些线程很少使用,我们的负载也很少。但是经过一个工作日后,elastic pool的线程数增加到1300个,现在执行在elastic-1XXX,elastic-12XX线程上,(name的数量在100以上甚至900以上)。

据我了解,Elastic 在底层使用了 cachedThreadPool。 为什么创建了新的弹性线程,为什么任务切换到新线程?

添加新趋势的标准是什么? 为什么旧线程(elastic-XX、elastic-1xx)没有被关闭?

如果没有更多关于工作负载类型、最大并发、突发和平均任务持续时间的信息,很难判断这里是否存在问题。

根据定义,只要有新任务添加到队列中,弹性调度程序就会创建无限数量的线程。

如果工作量是突发性的,定时夜间并发,那么发现大量线程是意料之外的。您可以利用 newElastic 变体来减少 TTL(默认值为 60s)。

同样,如果没有更多信息,很难判断,但您的工作负载可能不适合此调度程序。如果您的工作负载受 CPU 约束,则并行调度程序更适合。弹性的是为 IO/latency 绑定任务量身定制的。

问题是:我使用 Schedulers.elastic() 进行非阻塞操作,但没有这样的操作。当我删除 elastic() 后,我的服务开始正常工作(没有 elastic 的线程)。