Ответ
RecursiveTask — это абстрактный класс в пакете java.util.concurrent, являющийся частью Fork/Join Framework. Он предназначен для задач, которые можно рекурсивно разбивать на подзадачи и которые возвращают результат после выполнения.
Ключевые особенности:
- Наследуется от
ForkJoinTask<V>. - Используется для выполнения в
ForkJoinPool. - В отличие от
RecursiveAction, возвращает значение. - Основная логика реализуется в методе
compute().
Пример: вычисление числа Фибоначчи
import java.util.concurrent.RecursiveTask;
class FibonacciTask extends RecursiveTask<Integer> {
final int n;
FibonacciTask(int n) { this.n = n; }
@Override
protected Integer compute() {
if (n <= 1) return n;
// Создаем подзадачу для f(n-1) и запускаем асинхронно
FibonacciTask f1 = new FibonacciTask(n - 1);
f1.fork();
// Вычисляем f(n-2) в текущем потоке
FibonacciTask f2 = new FibonacciTask(n - 2);
// Ожидаем результат первой подзадачи и суммируем
return f2.compute() + f1.join();
}
}
Почему используется fork/join? Этот паттерн позволяет эффективно распараллеливать рекурсивные задачи, используя work-stealing алгоритм пула потоков, что повышает утилизацию процессорных ядер.