【问题标题】:Parallelization of a function using for loop使用for循环并行化函数
【发布时间】:2020-03-01 20:06:28
【问题描述】:

我有一个整数数组,我必须为每个值计算一些数字。我正在尝试将其并行化,例如我将数组分成多个分区,然后在它自己的线程中计算每个分区。为此,我创建了一个遍历分区的 for 循环,如下所示:

    for (int i = 0; i < arrSplit.length; i++) {
        Thread t = new Thread(new Runnable() {  
            @Override
            public void run() {
                for (int j = arrSplit[i].startIndex; j < arrSplit[i].startIndex+arrSplit[i].length; j++) {
                    factors[j] = numPrimeFactors(values[j]);
                }
            }
        });
    }

我遇到了以下两个问题:

  • “在封闭范围内定义的局部变量必须是最终或有效最终” - 我知道我在“arrSplit[i]”中的变量“i”超出了范围,但我不知道不知道如何访问它,但不太明白为什么它超出了范围。
  • 我怎样才能加入我的线程? - 如果我要加入 for 循环中的每个线程,我会有效地使并行化过时,因为下一个线程只会在第一个线程已经加入后才启动,对吧?那我该怎么办呢?

【问题讨论】:

    标签: java multithreading concurrency parallel-processing thread-safety


    【解决方案1】:

    “在封闭范围内定义的局部变量必须是最终的或有效的最终”

    它没有超出范围,它既不是最终的(因为它没有被声明为最终的)也不是有效的最终的(因为你在 for 循环的更新部分增加它)。

    您可以在外循环内声明final int ii = i;,并在可运行文件内使用ii 而不是i

    但实际上,您似乎不需要i,只需要访问arrSplit[i]。因此,使用增强的 for 循环会更容易:

    for (SplitType s : arrSplit) {
      // Use s in place of arrSplit[i].
    }
    

    如何加入我的话题?

    将它们放入一个列表中,然后在它们全部启动后依次在每个元素上调用join

    但使用并行流之类的东西可能更容易,因此您不必自己管理线程,甚至不必自己管理拆分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2017-04-18
      相关资源
      最近更新 更多