Назад к вопросам
Junior — Middle
62
Объясните, что такое класс RecursiveTask в рамках параллельных вычислений в Java?
Ответ от нейросети
sobes.tech AI
Класс RecursiveTask в Java — это абстрактный класс из пакета java.util.concurrent, предназначенный для реализации параллельных вычислений с использованием фреймворка Fork/Join. Он используется, когда задача может быть рекурсивно разбита на подзадачи, а результат каждой подзадачи нужно объединить для получения итогового результата.
Основные моменты:
- Наследуясь от
RecursiveTask<V>, вы реализуете методcompute(), в котором описываете логику разбиения задачи. - Если задача достаточно мала, она выполняется напрямую.
- Если задача большая, она разбивается на несколько подзадач, которые запускаются параллельно с помощью
fork(), а затем результаты объединяются с помощьюjoin().
Пример: вычисление суммы элементов массива с помощью RecursiveTask:
import java.util.concurrent.RecursiveTask;
public class SumTask extends RecursiveTask<Integer> {
private static final int THRESHOLD = 10;
private int[] array;
private int start, end;
public SumTask(int[] array, int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
int length = end - start;
if (length <= THRESHOLD) {
int sum = 0;
for (int i = start; i < end; i++) {
sum += array[i];
}
return sum;
} else {
int mid = start + length / 2;
SumTask leftTask = new SumTask(array, start, mid);
SumTask rightTask = new SumTask(array, mid, end);
leftTask.fork(); // запускаем левую подзадачу асинхронно
int rightResult = rightTask.compute(); // вычисляем правую подзадачу в текущем потоке
int leftResult = leftTask.join(); // ждём результат левой подзадачи
return leftResult + rightResult;
}
}
}
Таким образом, RecursiveTask помогает эффективно распараллеливать задачи, которые естественно разбиваются на подзадачи с результатом.