Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Défi ForkJoinPool | Meilleures Pratiques de Multithreading
Multithreading en Java
course content

Contenu du cours

Multithreading en Java

Multithreading en Java

1. Notions de Base du Multithreading
2. Collections Synchronisées
3. Mécanismes de Synchronisation de Haut Niveau
4. Meilleures Pratiques de Multithreading

book
Défi ForkJoinPool

Tâche

Imaginez que vous organisez un grand événement caritatif et que vous devez compter toutes les dons reçus. Vous avez une liste de montants de dons et vous souhaitez connaître la somme totale de tous les dons. Pour rendre cette tâche plus gérable, vous décidez de diviser la liste en plus petits morceaux et de distribuer ces morceaux parmi vos amis pour aider au comptage. Chaque ami calcule le montant total pour leur morceau assigné et vous rapporte le résultat. Vous combinez ensuite tous ces résultats pour obtenir le total final.

Vous avez une classe DonationTask qui étend RecursiveTask<Long>. Vous devez surcharger la méthode compute() dans cette classe pour implémenter la logique de division de la liste de dons et de calcul des montants.

La classe DonationTask inclut un champ constant THRESHOLD défini à 200. Ce seuil spécifie le nombre maximum de dons qu'un seul morceau doit contenir. Ne changez pas ce seuil.

Par exemple, si vous commencez avec une liste de 1 000 dons, vous devriez la diviser en morceaux de 200 dons ou moins chacun. Ensuite, calculez le montant total en additionnant les résultats de chaque morceau.

  • THRESHOLD - seuil de division du tableau;
  • long[] listDonations - tableau source avec toutes les donations;
  • int start - le début du tableau;
  • int end - fin du tableau.

Il y a aussi une classe RunnableTask où nous exécutons le programme. C'est ici que nous initialisons notre liste et l'exécutons dans un ForkJoinPool. Une fois que tout est en place et fonctionne, nous affichons le résultat.

Si vous implémentez correctement la méthode compute(), vous devriez obtenir le montant total :

Conseils pour la solution

Dans la méthode compute(), nous devons vérifier si la taille de notre tableau (liste de dons) est inférieure au seuil actuel, THRESHOLD. Si elle est inférieure, alors c'est parfait ; nous parcourons simplement tous les éléments de ce tableau (liste de dons), les additionnons et retournons le résultat.

Si la taille est plus grande, alors nous devons trouver le milieu du tableau et traiter récursivement les côtés gauche et droit du tableau (comme si nous divisions la liste entre amis).

Pour ce faire, nous créons 2 objets DonationTask, passons les limites du tableau et le tableau lui-même comme paramètres, puis appelons la méthode fork() sur ces objets. Enfin, nous obtenons le résultat de la somme en appelant join() sur chaque tâche, en ajoutant les résultats ensemble, et en retournant le total.

Note

Ça semble assez compliqué, mais en fait, vous devez juste comprendre et mettre en œuvre l'illustration ci-dessus !

Je suis sûr que vous pouvez le faire ! Mais si vous avez des difficultés, vous pouvez voir la solution.

Une fois que vous êtes sûr que tout fonctionne, exécutez les tests de vérification sur le chemin /src/test/java/TaskForkJoinTest.java.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 3
We're sorry to hear that something went wrong. What happened?
some-alt