当前位置: 首页 > 知识库问答 >
问题:

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

徐友樵
2023-03-14
    for(SellerNames sellerNames : sellerDataList) {
        for(String selleName : sellerNames) {
        //getSellerAddress(sellerName)
        //parallize this task
        }
    }

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

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

共有1个答案

胡越
2023-03-14

有两种方法可以使它并行运行:流和执行器。

您可以使用并行流,而将其余的留给JVM。在这种情况下,你没有太多的控制什么时候发生。另一方面,您的代码将易于阅读和维护:

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

假设,您希望有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();
    }
 类似资料:
  • 问题内容: 我听说Java 8提供了许多有关并发计算的实用程序。因此,我想知道并行化给定for循环的最简单方法是什么? 问题答案: 在流上阅读,它们都是新的流行。 特别注意并行性: “具有显式for循环的处理元素本质上是串行的。流通过将计算重新格式化为聚合操作的流水线,而不是作为对每个单独元素的命令性操作来促进并行执行。所有流操作都可以串行或并行执行。 ” 综上所述,没有并行的for循环,它们本质

  • 我听说Java8提供了很多关于并发计算的实用程序。因此,我想知道并行给定for循环的最简单方法是什么?

  • 我想在一个并行外部循环中运行一个包含for循环(应该并行运行)的函数。因此看起来如下所示: 给定上面的代码,我希望在函数中为循环创建5个并行线程,并且希望这5个线程中的每个线程创建另一个线程来运行自己的并行for循环。

  • 本文向大家介绍使用java的HttpClient实现多线程并发,包括了使用java的HttpClient实现多线程并发的使用技巧和注意事项,需要的朋友参考一下 说明:以下的代码基于httpclient4.5.2实现。 我们要使用java的HttpClient实现get请求抓取网页是一件比较容易实现的工作: 要多线程执行get请求时上面的方法也堪用。不过这种多线程请求是基于在每次调用get方法时创建

  • 我有一个python for循环,它执行一个bash脚本,如下所示(我将其简化为只包含需要显示的内容),我需要它在for循环中同时运行所有这些bash脚本,但要等到它们全部完成后才能继续串联。bash脚本是我唯一希望并行运行的部分。它是在同一for循环的下游做一些需要串联完成的事情。这可能吗? 以下是系列作品。没有脚本的并行执行,因为。如果我删除. etc(),它几乎立即出错,下游的任何东西都不再

  • 问题:我能否使用Java流API(即一行)实现方法。需要变量来定义字符串的长度;我尝试为每个循环,但它不工作。我需要一个循环的范围。 我的尝试: