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

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 и не может быть назначен.

  1. fork / join: может быть, но ищу другое решение, которое не связано с объявлением нового класса или расширением существующего.
-1
Uri Loya 23 Окт 2019 в 20:47

1 ответ

Лучший ответ

Нет причин делать это параллельно; поскольку вы работаете с 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]
3
Jacob G. 23 Окт 2019 в 17:59