Contenu du cours
Multithreading en Java
Multithreading en Java
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
.
Merci pour vos commentaires !