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

Java 8:并行FOR循环

乌和畅
2023-03-14

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

public static void main(String[] args)
{
    Set<Server> servers = getServers();
    Map<String, String> serverData = new ConcurrentHashMap<>();

    for (Server server : servers)
    {
        String serverId = server.getIdentifier(); 
        String data = server.fetchData();

        serverData.put(serverId, data);
    }
}

共有3个答案

公冶泰
2023-03-14

更优雅或功能更强大的解决方案将只使用收集器toMap或toConcurrentMap函数,这样可以避免为ConcurrentHashMap维护另一个有状态变量,如下例所示:

final Set<Server> servers = getServers();
Map<String, String> serverData = servers.parallelStream().collect(
    toConcurrentMap(Server::getIdentifier, Server::fetchData));

注意:1.那些功能接口(Server::getIdfier或Server::fetchData)不允许抛出检查异常,2.为了获得并行流的全部好处,服务器的数量会很大,并且不涉及I/O,这些功能中纯粹是数据处理(getIdfier, fetchData

请参阅收集器javadochttp://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toConcurrentMap

滕无尘
2023-03-14

这将使用流:

servers.parallelStream().forEach(server -> {
    serverData.put(server.getIdentifier(), server.fetchData());
});

我怀疑Collector可以在这里发挥更大的作用,因为您使用并发集合。

施令雪
2023-03-14

阅读流,它们是最新流行的。

尤其要密切注意有关并行性的位:

具有显式for循环的处理元素本质上是串行的。流通过将计算重新构造为聚合操作的管道,而不是每个元素上的强制操作,来促进并行执行。所有流操作都可以串行或并行执行

所以总结一下,没有并行的for循环,它们本质上是串行的。但是流可以完成这项工作。看看下面的代码:

    Set<Server> servers = getServers();
    Map<String, String> serverData = new ConcurrentHashMap<>();

    servers.parallelStream().forEach((server) -> {
        serverData.put(server.getIdentifier(), server.fetchData());
    });
 类似资料:
  • 我想在一个并行外部循环中运行一个包含for循环(应该并行运行)的函数。因此看起来如下所示: 给定上面的代码,我希望在函数中为循环创建5个并行线程,并且希望这5个线程中的每个线程创建另一个线程来运行自己的并行for循环。

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

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

  • 问题内容: 我一直在尝试并行化以下脚本,特别是for循环。我怎样才能做到这一点? 问题答案: 更换 与

  • 在大多数情况下,Java8流允许的代码比老式的循环更易读。然而,根据我自己的经验和阅读的内容,使用stream而不是for循环可能会导致性能下降(或者偶尔会带来改进),这有时很难预测。 在一个大型项目中,为每个循环编写基准测试似乎是不可行的,因此,当决定是否用流替换循环时,有哪些关键因素(例如,集合的预期大小、通过筛选移除的值的预期百分比、迭代操作的复杂度、缩减或聚合的类型,等等)可能给出将导致的

  • 问题内容: 我刚接触Python,但仍处于学习曲线的艰难阶段。感谢您的任何评论。 我有一个很大的for循环要运行(在许多迭代中都很大),例如: 我虽然认为这将是一个如何并行化的常见问题,但在Google上搜索了数小时后,我使用“多重处理”模块找到了解决方案,如下所示: 当循环较小时,此方法有效。但是,如果循环很大,这确实很慢,或者如果循环太大,有时会发生内存错误。看来python会首先生成参数列表