gpt4 book ai didi

java - 使用 for 循环的函数并行化

转载 作者:行者123 更新时间:2023-12-01 16:42:33 24 4
gpt4 key购买 nike

我有一个整数值数组,我必须为每个值计算一些数字。我正在尝试将其并行化,例如我将数组划分为多个分区,然后在其自己的线程中计算每个分区。为此,我创建了一个 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 循环中,我将有效地使并行化过时,因为下一个线程只会在第一个线程已经启动后才启动加入了,对吗?那么我该怎么办呢?

最佳答案

"local variable defined in an enclosing scope must be final or effectively final" 

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

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

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

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

How can I join my threads?

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

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

关于java - 使用 for 循环的函数并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60479282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com