Contenu du cours
Multithreading en Java
Multithreading en Java
Défi BlockingQueue
Tâche
Vous aurez simplement besoin d'implémenter certaines méthodes de BlockingQueue
pour mieux comprendre comment la collection elle-même fonctionne et pour mieux apprendre le matériel !
Vous devez aller dans BlockingQueueueImpl
, dans la classe elle-même, il y aura 2 méthodes non réalisées que vous devez implémenter vous-même. Vous n'avez pas besoin de trouver une solution compliquée, vous devez simplement répéter la fonctionnalité d'une BlockingQueueue
régulière.
Remarque
Vous avez également une classe
Main
dans laquelle vous devrez tester votreBlockingQueueueImpl
pour vous assurer qu'elle fonctionne correctement.
Vous pouvez vérifier cela en ajoutant plus de 10 éléments à la queue
(ou plus que la limit
que vous avez initialisée dans le constructeur) et le prochain élément devra attendre jusqu'à ce qu'il y ait moins d'éléments dans la queue que la limite et seulement alors écrire le prochain élément.
put()
- méthode synchronisée qui ajoute des éléments à la file d'attente si la limite de la file n'est pas dépassée, si elle l'est, elle met en pause la file d'attente
take()
- méthode synchronisée qui prend un élément de la file d'attente, le retourne et le supprime, si la file est vide, la met en pause
Astuce de Solution
Pour implémenter put()
vous devez vérifier si la file d'attente est pleine, c'est-à-dire si elle n'est pas égale à la limite et si elle l'est, mettre le thread en pause. Si elle n'est pas pleine, vous devez vérifier si la file d'attente est vide (isEmpty()
) et si le thread est vide, appeler la méthode qui libère tous les threads (notifyAll()
). Ensuite, ajoutez l'élément à la queue
.
Pour implémenter take()
vous devez vérifier si la file d'attente est vide, si elle est vide, vous mettez le thread en pause (car il n'y a rien à lire), si la file d'attente n'est pas vide vous effectuez une autre vérification pour la complétude de la liste et si la taille de la liste est égale à limit
, alors libérez tous les threads et retournez le premier élément dans la file d'attente (celui qui a été ajouté plus tard que les autres).
Méthodes que vous devrez exécuter
wait()
- met le thread en pause;notifyAll()
- réveille tous les threads qui sont en pause;queue.isEmpty()
- Vérifie si la file d'attente est vide (true - la file d'attente est vide).
Après avoir exécuté ces méthodes et testé dans la classe Main
, allez à /src/test/java/BlockingQueueueImplTest.java
et exécutez tous les tests.
S'ils s'exécutent avec succès, félicitations, vous avez tout fait correctement ! Sinon, soit vous avez la mauvaise solution soit vous avez changé quelque chose qui n'aurait pas dû être changé.
Remarque
Essayez également de résoudre le problème vous-même, mais si vous n'y parvenez pas et que vous souhaitez connaître la réponse, il y a un lien vers la solution. Ne vous contentez pas de copier le code, mais essayez de le comprendre !
Merci pour vos commentaires !