JVM可以处理多少ScheduledExecutorService每个都有1个线程?

问题描述

我创建了一个代表用户会话的类,该用户会话每25秒将ping发送到另一个服务。为此,我在该课程中使用了scheduledexecutorserviceScheduledFuture

public class UserSession {
 
  private scheduledexecutorservice scheduledexecutorservice;
  private ScheduledFuture<?> keepAliveTask;
    
  public UserSession() {
      this.scheduledexecutorservice = Executors.newScheduledThreadPool(1);
      this.keepAliveTask = scheduledexecutorservice.scheduleAtFixedrate(() -> {         
            this.sendPing();
      },25L,TimeUnit.SECONDS);
  }
  .....
  .....
}

现在的问题是,将有大约4000-5000个用户会话,因此将有4000-5000个UserSession对象,每个对象都有其自己的scheduledexecutorservice单线程。因此,如果我正确理解这一点,大约会有4000-5000个线程,每个线程负责发出相应会话的ping。

那么,JVM是否会处理那么多线程或scheduledexecutorservice?我知道这取决于cpu,但这是个好主意吗?还是有更好的选择?

解决方法

JVM将线程委托给基础操作系统。

因此,如果操作系统和硬件(主要是处理器及其内核)可以在一个进程中支持那么多线程,那么您的问题就更加令人担忧。

这是个好主意吗?还是有更好的选择?

我不知道您项目的范围。其他实现目标的想法:

  • Quartz和Message Queue应用程序,例如ActiveMQ,RabbitMQ甚至Apache Kafka。
  • 具有Akkaactorsscheduler演员模型系统