生成 5 万个线程的可扩展性指南

Scalability guidance for spawning 50 thousand threads

我有 Java 应用程序读取包含 SQL 查询的 JSON 文件,并使用 JDBC.

在数据库中触发它们

现在我有 5 万个这样的文件,我需要生成 5 万个独立线程来读取每个文件并将它们上传到数据库中。我需要在特定秒数后的特定时间生成这些线程。例如当我应该生成这些线程时,我有以下已排序登录详细信息的映射。登录详细信息以秒为单位,在 0 秒、10 秒、50 秒等处生成许多线程

Map<String,Integer> loginMap = new HashMap<>(50000);

我正在使用 ScheduleExecutureService 来安排这些线程我有类似以下内容

ScheduleExecutureService ses = Executors.newScheduledThreadPool(50000);
for(Map.Entry<String,Integer> entry : loginMap.entrySet()) {
     Integer loginTime = (Integer) entry.getValue();
      ses.schedule(new MyWorker(entry.getKey()),loginTime,TimeUnit.SECONDS);
}

以上代码适用于几千个小文件,但不能扩展到 50,000 个,而且由于我的工作人员使用 JDBC 连接,数据库 运行 连接不足。

即使我在线程的 运行 方法中获取连接。这些线程是否开始执行 运行,即使它不应该 运行?我是多线程新手。

您不需要 50,000 个线程!每个线程都会消耗一些资源,特别是用于堆栈的 RAM 区域 space,这可能约为 1MB。你有 50GB 内存吗?

运行 线程数多于核心数也没有任何好处。

这并不意味着您不能对 50,000 个任务和合理数量的与硬件相关的工作线程进行排队。

ScheduleExecutureService ses = Executors.newScheduledThreadPool(8); //sensible, though could be derived from acutal hardware capabilities.