Cómo paralelizar un método recursivo en Java

Para operaciones paralelas básicas, solo debe conocer algunas clases:

  • ForkJoinPool
  • RecursiveTask
  • Acción recursiva; Al igual que RecursiveTask, excepto que no devuelve un resultado

Todas las clases están en el paquete java.util.concurrent. Las declaraciones de importación serían las siguientes:

import java.util.concurrent.ForkJoinPool;

import java.util.concurrent.RecursiveTask;

Para usar la biblioteca, necesita un objeto ForkJoinPool. En Java 8, obtiene el objeto que desea llamando al método estático ForkJoinPool.commonPool (). Solo en Java 7 o 6, debe crear un grupo a través de la nueva ForkJoinPool (), pero haga esto solo una vez y almacene el resultado en un campo estático de alguna clase, para que todo su programa pueda usarlo:

público estático ForkJoinPool fjPool = new ForkJoinPool ();

(Este constructor alienta al grupo a usar todos los procesadores disponibles. En Java 8, el objeto de grupo común también hace esto). No desea tener más de un objeto ForkJoinPool en su programa; la biblioteca lo admite para usos avanzados, pero desalienta su uso.

Es el trabajo del grupo tomar todas las tareas que se pueden hacer en paralelo y usar los procesadores disponibles de manera efectiva.

Su método de cálculo puede crear otros objetos RecursiveTask y hacer que el grupo los ejecute en paralelo. Primero creas otro objeto. Entonces llamas a su método fork. Eso realmente comienza el cálculo paralelo: la bifurcación en sí misma regresa rápidamente, pero ahora hay más cálculos. Cuando necesita la respuesta, llama al método de unión en el objeto al que llamó fork. El método de unión le dará la respuesta de compute () que fue resuelta por fork. Si aún no está listo, la unión se bloqueará (es decir, no regresará) hasta que esté listo. Entonces, el punto es llamar a fork “temprano” y llamar a join “tarde”, haciendo otro trabajo útil en el medio.