【问题标题】:Parallelize a for loop using multi-threading in java在java中使用多线程并行化for循环
【发布时间】:2019-03-09 13:27:57
【问题描述】:

我在 java 中有一个 for 循环,它具有以下结构,我需要并行化为固定数量的线程。假设该号码在numThreads 中。下面给出了 for 循环。请注意,只有外部循环需要并行化。我想我需要使用 Executor,但我不知道如何将工作负载拆分为不同的线程,以及是否会改变我在循环内的索引,如isInsulator[x][y] 之类的语句。基本上我想要不同的线程拆分 X 的值并为分配给它们的那些 x 值运行 for 循环。那有意义吗?任何人都可以帮助我实现这一目标,或者请把我推向正确的方向吗?

【问题讨论】:

  • 无关:不要因为可以使用空行。您以某种方式使用垂直间距来group 事物。只是到处都是空行并不能帮助您的人类读者。从相反的方面来说。空行很好,但作为非空行,你使用它们是因为它有意义,而不是因为你可以!
  • 是数组(isInsulator、isHeater、nextArr 和 currArr)类变量还是局部变量?
  • 你能详细介绍一下 giveHeat 的方法吗?它是线程安全的吗?
  • giveHeat() 是否使用上一次迭代的结果? (我怀疑它可能会在您传递x - 1 时这样做。)如果是这样,那么您不能使用并行处理。
  • 数组 isInsulator、isHeater、nextArr 和 currArr 是类变量。 giveHeat() 不是线程安全的。不过,目前我并不担心这一点。我将更改通话以避免竞争条件。

标签: java multithreading parallel-processing


【解决方案1】:

你可以声明一个固定的线程池(它会初始化并只使用指定数量的线程):

Executor executor = Executors.newFixedThreadPool(numThreads);

你必须向线程池提交 X 个任务:

for (int i = 0; i < X; i++) {
        final int x = i;
        executor.execute(() -> submitTask(x));
}

在方法 submitTask 中你可以定义你的逻辑:

private void submitTask(final int x) {
    for (int y = 0; y < Y; y++) {
        //do stuff
    }
}

【讨论】:

    【解决方案2】:
    1. 编写一个基准测试(这样您就可以证明并行处理确实更快),使用 JMH。
    2. 将代码重写为produce_inputs-&gt;process-&gt;collect_or_summarize管道
    3. 使用并行 Streams API(它使用一个内部 fork-join 池,该池根据机器上的 CPU 数量进行调整)。
    4. 比较顺序处理与并行处理的性能。
    int result = IntStream.generate(() -> 42) // 惰性输入源 .limit(100) // 限制输入数量 .parallel() // 使用并行处理 // .sequential() // ...或顺序处理 .map(x -> x + 1) // 进行处理 .reduce(0, Math::addExact); // 总结结果 // .collect(toList()); // ...或者只是将它收集到一个容器中

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多