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

时间:2018-10-04 08:04:18

标签: java multithreading parallel-processing

我在Java中有一个for循环,具有以下结构,需要将其并行化为固定数量的线程。可以说该数字在numThreads中。 for循环如下所示。注意,只有外循环需要并行化。我想我需要使用Executor,但是我无法弄清楚如何将工作负载划分为不同的线程,如果那样会改变循环内的isInsulator[x][y]之类的索引。基本上,我希望不同的线程拆分X的值并为分配给它们的x值运行for循环。那有意义吗?有人可以帮助我实现这一目标,或者可以将我推向正确的方向吗?

2 个答案:

答案 0 :(得分:1)

  1. 编写一个基准测试(以便您可以证明使用并行处理确实更快),请使用JMH。
  2. 将代码重写为produce_inputs->process->collect_or_summarize管道
  3. 使用并行Stream的API(它使用一个内部fork-join池,已调整为盒子上的CPU数量)。
  4. 比较顺序处理与并行处理的性能。
int result = IntStream.generate(() -> 42) // lazy inputs source
        .limit(100) // limit number of inputs
        .parallel() // use parallel processing
//      .sequential() // ...or sequential processing
        .map(x -> x + 1) // do the processing
        .reduce(0, Math::addExact); // summarize the result
//      .collect(toList()); // ...or just collect it to a container

答案 1 :(得分:0)

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

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
    }
}