Я хочу скопировать один массив в другой параллельно , например:
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. Конечно, это может быть и любой другой вариант.
Что нужно учитывать:
- Я планирую запустить это на очень больших массивах, поэтому небольшие накладные расходы в порядке
- В тело цикла может быть добавлен дополнительный код, например, другой массив - c, который получит [i] +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 ответ
Нет причин делать это параллельно; поскольку вы работаете с 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]
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].