gpt4 book ai didi

java - 产生 5 万个线程的可扩展性指南

转载 作者:行者123 更新时间:2023-12-01 18:17:12 28 4
gpt4 key购买 nike

我有一个 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);
}

上面的代码适用于几千个小文件,但它无法扩展到 5 万个,而且由于我的工作人员使用 JDBC 连接,数据库连接已耗尽。

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

最佳答案

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

运行比内核数量多的线程也没有任何好处。

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

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

关于java - 产生 5 万个线程的可扩展性指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28886715/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com