使用多线程并行化 Java 中的 for 循环

2024-06-20

我对java很陌生,我想使用执行器服务或使用java中的任何其他方法并行化嵌套for循环。我想创建一些固定数量的线程,这样CPU就不会完全被线程占用。

    for(SellerNames sellerNames : sellerDataList) {
        for(String selleName : sellerNames) {
        //getSellerAddress(sellerName)
        //parallize this task
        }
    }

sellerDataList 的大小 = 1000,sellerNames 的大小 = 5000。

现在我想创建 10 个线程,并将相同的任务块平均分配给每个线程。对于第 i 个 sellerDataList,第一个线程应该获取 500 个名称的地址,第二个线程应该获取接下来 500 个名称的地址,依此类推。
完成这项工作的最佳方法是什么?


有两种方法可以让它并行运行:Streams 和 Executors。

使用流

你可以使用并行流,剩下的交给jvm。在这种情况下,您对何时发生的情况没有太多控制权。另一方面,您的代码将易于阅读和维护:

    sellerDataList.stream().forEach(sellerNames -> {
        Stream<String> stream = StreamSupport.stream(sellerNames.spliterator(), true); // true means use parallel stream
        stream.forEach(sellerName -> {
            getSellerAddress(sellerName);
        });
    });

使用ExecutorService

假设您需要 5 个线程,并且希望能够等到任务完成。然后您可以使用具有 5 个线程的固定线程池并使用Future-s 这样你就可以等到它们完成。

    final ExecutorService executor = Executors.newFixedThreadPool(5); // it's just an arbitrary number
    final List<Future<?>> futures = new ArrayList<>();
    for (SellerNames sellerNames : sellerDataList) {
        for (final String sellerName : sellerNames) {
            Future<?> future = executor.submit(() -> {
                getSellerAddress(sellerName);
            });
            futures.add(future);
        }
    }
    try {
        for (Future<?> future : futures) {
            future.get(); // do anything you need, e.g. isDone(), ...
        }
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用多线程并行化 Java 中的 for 循环 的相关文章

随机推荐

  • 在 ASP.Net 网站中使用 VBScript 中的变量

    我花了一天的大部分时间来研究这个问题 但找不到答案 我对 stackoverflow 比较陌生 询问多个问题是否有一定的礼仪 过去几天我问了三个问题 Anyways 这是代码隐藏文件中的代码 它执行脚本 systeminfo vbs 并且工
  • Swift 协议扩展实现另一个具有共享关联类型的协议

    考虑以下 protocol Foo typealias A func hello gt A protocol FooBar Foo func hi gt A extension FooBar func hello gt A return h
  • 如何(从 Google 电子表格)获取链接表单的 ID

    我有一个 Google 电子表格 其中链接了一个表单 并且存储了所有表单响应 我想要查找的是表单本身的 ID 我尝试过这个 但这不起作用 我正在表单链接到的电子表格中的脚本编辑器中运行以下代码 function getID var form
  • 正则表达式,提取不在两个括号之间的字符串

    好的正则表达式问题 如何提取不在两个字符之间的字符 在本例中是括号 我有一个字符串 例如 字1 字2 字3 字 4 我只想获取第一个和最后一个 管道 而不是括号之间的第二个 管道 我已经尝试了无数次负克拉和负分组的尝试 但似乎无法使其发挥作
  • 在 Yosemite 上安装 Ruby 1.9.2 时出错

    我在 Yosemite 上使用 rvm 安装 ruby 1 9 2 时遇到错误 有人可以帮助我吗 我更新了自制程序和rvm 我正在与其他人合作处理这个项目 所以我无法升级 ruby 我在下面放置了我的输出的链接 提前致谢 Kanyons M
  • 如何以编程方式更改 iPhone APN(接入点名称)?

    如何以编程方式更改 iPhone APN 接入点名称 或者强制 3G GPRS 连接以编程方式使用特定的 APN 无法通过 SDK 完成 第三方应用程序无法对硬件进行这种级别的控制 尤其是蜂窝调制解调器
  • 函数内开玩笑模拟函数

    我不知道如何在笑话中模拟内部函数的返回值 我尝试了不同的方法 最后我找到了这个answer https stackoverflow com questions 51269431 jest mock inner function但由于某种原因
  • 在 System.Xml.XPath 中启用 XPath2 查询(XPathException:无效令牌)

    Microsoft 的 System Xml XPath nuget package 可用于 NET 4 6 声称支持 XPath 1 0 和 2 0 德文档 https msdn microsoft com en us library s
  • 核心数据:尝试查找实体中属性的最小日期

    我正在尝试查找核心数据中特定属性中最旧的日期 我发现了核心数据编程指南中的示例 http developer apple com mac library documentation cocoa conceptual CoreData Art
  • 将二进制图像划分为像素数据“块”

    我使用 Python 和 PIL 作为在二进制图像中嵌入数据的工作的一部分 并且需要分析像素组以确定要操作的适当像素 以便嵌入数据 图像需要被分割成相等的像素数据 块 以供分析 但我正在努力想出一种适当的方法来做到这一点 我尝试过使用 Py
  • 使用 mod_proxy 进行反向代理,保留原始请求 URL

    我已经使用 mod proxy Apache2 配置了一个反向代理 监听 127 0 0 1 80 将所有请求代理到 127 0 0 1 8080 所以我配置了 mod proxy 如下所示 ProxyPreserveHost On Pro
  • 检测分段常数信号中的阶跃

    我有一个分段恒定信号 如下所示 我想检测步骤转换的位置 标记为红色 我目前的做法 使用移动平均滤波器平滑信号 http www mathworks com help signal examples signal smoothing html
  • 从 apk 文件生成 Android App Bundle aab

    我正在使用 Xamarin 开发 Android 应用程序 据我所知 它不支持 Android 应用程序包 https github com xamarin xamarin android issues 1709 所以我想知道是否有任何方法
  • React 文件预览 (FIREBASE)

    我目前将文件存储在 Firebase 存储中 我希望能够实时生成每个文件的文件预览 映射 例如 PDF 文件会将第一页显示为图像 docx 将是文档的第一页 pptx 将是第一张幻灯片 未知文档将是默认文档符号 有人知道有什么好的服务可以轻
  • 模板类的格式错误的非模板方法的实例化

    我正在研究两阶段名称查找 https stackoverflow com questions 7767626 two phase lookup explanation needed 一个非常合乎逻辑的解释表明主要推理之一 https sta
  • Vue - 在设置脚本中使用 i18n

    我需要找到一种方法来使用 t of i18n在我的设置脚本中vue project 我的 i18n 文件如下所示 import createI18n from vue i18n import en from en import es fro
  • SQLAlchemy 相当于 Django ORM 的关系跨越过滤器

    这个例子来自于Django 文档 https docs djangoproject com en 1 3 topics db queries 给定 Django 数据库模型 class Blog models Model name mode
  • 解析分隔字符串

    我怎样才能得到 connect 100 username example 从这个字符串 ngg connect gt 100 username gt example Using std string find有参数 and gt and s
  • Angular ng new 返回包安装失败错误-compiler.umd.js 丢失

    我正在尝试学习 Angular 并且正在学习在线教程 但是 我似乎无法通过 ng new 创建一个新项目 我在 Windows 7 上运行节点 v10 16 0 和 npm 6 9 0 我在日志中收到以下错误 15177 verbose c
  • 使用多线程并行化 Java 中的 for 循环

    我对java很陌生 我想使用执行器服务或使用java中的任何其他方法并行化嵌套for循环 我想创建一些固定数量的线程 这样CPU就不会完全被线程占用 for SellerNames sellerNames sellerDataList fo