Копирование параллельного массива в Java - PullRequest
0 голосов
/ 23 октября 2019

Я хочу скопировать массив в другой в параллельно , например:

int[] a = {1, 3, 5, 7, 9};
int[] b = new int[a.length];
for(int i = 0; i < a.length; i++) // parallel
{
   b[i] = a[i];
}

В этом примере я хотел бы, чтобы один поток скопировал первые 3 индекса, идругой, чтобы скопировать другой 2. Конечно, это может быть и в любом другом варианте.


На что следует обратить внимание:

  1. Я планирую запустить это на очень больших массивах, поэтому небольшие издержки - это нормально
  2. Возможно, добавлено больше кодак телу цикла, например, другому массиву - c, который получит [i] + 1

Что я пробовал:

  1. IntStream.range:
    IntStream.range(0, a.length).parallel().forEach(i -> {
        b[i] = a[i];
    });

Это привело к ошибке Local variable percentiles defined in an enclosing scope must be final or effectively final, поскольку b не является final и не может быть назначено.

fork / join: возможно, но он ищет другое решение, которое не включает объявление нового класса или расширение существующего.

1 Ответ

3 голосов
/ 23 октября 2019

Нет причин делать это параллельно;поскольку вы работаете с int[], вы можете использовать clone() для его копирования:

int[] a = {1, 3, 5, 7, 9};
int[] b = a.clone();

Если по какой-то причине вы все еще хотите сделать это параллельно, тогда вы можете использовать Arrays#parallelSetAll:

Arrays.parallelSetAll(b, i -> a[i]);

Для каждого фрагмента элементы b эквивалентны:

[1, 3, 5, 7, 9]
...