在并行循环中,数组索引超出范围的原因通常是由于多个线程同时尝试访问或修改同一个数组位置,导致其中一个线程访问了超出数组界限的索引。为了解决这个问题,可以采取以下几种方法:
import java.util.Vector;
import java.util.concurrent.ThreadLocalRandom;
public class ParallelLoopExample {
public static void main(String[] args) {
Vector series = new Vector<>();
// 并行循环向series中添加元素
IntStream.range(0, 1000).parallel().forEach(i -> {
int value = ThreadLocalRandom.current().nextInt(100);
series.add(value);
});
System.out.println(series);
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class ParallelLoopExample {
public static void main(String[] args) {
List series = new ArrayList<>();
// 并行循环向series中添加元素
IntStream.range(0, 1000).parallel().forEach(i -> {
int value = ThreadLocalRandom.current().nextInt(100);
// 使用线程局部变量将元素添加到局部列表中
List localSeries = new ArrayList<>();
localSeries.add(value);
// 将局部列表中的元素添加到整体列表中
synchronized (series) {
series.addAll(localSeries);
}
});
System.out.println(series);
}
}
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.ThreadLocalRandom;
public class ParallelLoopExample {
public static void main(String[] args) {
int[] series = new int[1000];
AtomicInteger index = new AtomicInteger(0);
// 并行循环向series中添加元素
IntStream.range(0, 1000).parallel().forEach(i -> {
int value = ThreadLocalRandom.current().nextInt(100);
// 使用原子操作将元素添加到数组中
int currentIndex = index.getAndIncrement();
if (currentIndex < series.length) {
series[currentIndex] = value;
}
});
System.out.println(Arrays.toString(series));
}
}
这些方法可以帮助你在并行循环中避免数组索引超出范围的问题。根据具体情况,选择适合的方法来解决问题。