Le framework Fork/Join fait partie du package java.util.concurrent, introduit dans Java 7. Il est conçu pour les tâches qui peuvent être divisées de manière récursive en morceaux plus petits, où chaque morceau peut être traité indépendamment. Le framework fonctionne sur le principe de diviser pour régner, ce qui le rend idéal pour des tâches telles que le tri, la recherche et d'autres algorithmes récursifs.
ForkJoinTask est la classe de base pour les tâches qui peuvent s'exécuter dans le framework Fork/Join. Il fournit les opérations de base qui permettent aux tâches de créer de nouvelles sous-tâches et de les rejoindre une fois qu'elles sont terminées.
Exemple :
import java.util.concurrent.RecursiveTask; public class SumTask extends RecursiveTask<Integer> { private final int[] arr; private final int start, end; public SumTask(int[] arr, int start, int end) { this.arr = arr; this.start = start; this.end = end; } @Override protected Integer compute() { if (end - start <= 10) { int sum = 0; for (int i = start; i < end; i++) { sum += arr[i]; } return sum; } else { int mid = (start + end) / 2; SumTask leftTask = new SumTask(arr, start, mid); SumTask rightTask = new SumTask(arr, mid, end); leftTask.fork(); int rightResult = rightTask.compute(); int leftResult = leftTask.join(); return leftResult + rightResult; } } }
ForkJoinPool est la classe centrale qui gère un pool de threads de travail pour exécuter des instances ForkJoinTask. Il utilise un algorithme de vol de travail pour garder tous les threads occupés en redistribuant les tâches des threads occupés vers les threads inactifs.
Exemple :
import java.util.concurrent.ForkJoinPool; public class ForkJoinExample { public static void main(String[] args) { int[] arr = new int[100]; for (int i = 0; i < arr.length; i++) { arr[i] = i + 1; } ForkJoinPool pool = new ForkJoinPool(); SumTask task = new SumTask(arr, 0, arr.length); int result = pool.invoke(task); System.out.println("Sum: " + result); } }
RecursiveTask est utilisé lorsque votre tâche renvoie un résultat, tandis que RecursiveAction est utilisé lorsqu'elle ne renvoie aucun résultat.
Exemple utilisant RecursiveAction :
import java.util.concurrent.RecursiveAction; public class PrintTask extends RecursiveAction { private final int[] arr; private final int start, end; public PrintTask(int[] arr, int start, int end) { this.arr = arr; this.start = start; this.end = end; } @Override protected void compute() { if (end - start <= 10) { for (int i = start; i < end; i++) { System.out.print(arr[i] + " "); } System.out.println(); } else { int mid = (start + end) / 2; PrintTask leftTask = new PrintTask(arr, start, mid); PrintTask rightTask = new PrintTask(arr, mid, end); invokeAll(leftTask, rightTask); } } }
L'exécution du ForkJoinExample affichera la somme des éléments du tableau. Le framework Fork/Join divise la tâche en morceaux plus petits et les traite en parallèle, montrant des améliorations significatives des performances, en particulier avec de grands ensembles de données.
Par exemple, en résumant les nombres de 1 à 100 :
Sum: 5050
Dans le cas de PrintTask , le framework divise la tâche d'impression du tableau, l'exécutant en parallèle et produisant les segments simultanément :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
Le Fork/Join Framework est un outil puissant en Java pour optimiser les tâches de traitement parallèle. Il excelle dans les scénarios dans lesquels les tâches peuvent être divisées en sous-tâches plus petites, exécutées indépendamment, puis combinées pour produire le résultat final. Bien qu'il introduit de la complexité, les avantages en termes de performances dans les environnements multicœurs l'emportent souvent sur les inconvénients, ce qui en fait un excellent choix pour les problèmes récursifs importants et liés au processeur.
Lisez les articles plus sur : Qu'est-ce que Fork/Join Framework en Java ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!