Что такое RecursiveTask в Java?

«Что такое RecursiveTask в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 алгоритм пула потоков, что повышает утилизацию процессорных ядер.