Défi : File de Blocage
Tâche
Vous devez simplement implémenter certaines méthodes de BlockingQueue afin de mieux comprendre le fonctionnement de cette collection et d'approfondir la matière !
Vous devez vous rendre dans BlockingQueueueImpl, où la classe contient 2 méthodes non implémentées que vous devrez réaliser vous-même. Il n'est pas nécessaire de proposer une solution complexe, il suffit de reproduire la fonctionnalité d'une BlockingQueueue classique.
Vous disposez également d'une classe Main dans laquelle vous devrez tester votre BlockingQueueueImpl afin de vérifier son bon fonctionnement.
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 l’élément suivant devra attendre qu’il y ait moins d’éléments dans la queue que la limite, puis seulement écrire le prochain élément.
put() - méthode synchronisée qui ajoute des éléments à la queue si la limite de la queue n’est pas dépassée, sinon elle met la queue en pause
take() - méthode synchronisée qui prend un élément de la queue, le retourne et le supprime ; si la queue est vide, elle la met en pause
Astuce de solution
Pour implémenter put(), il faut vérifier si la queue est pleine, c’est-à-dire si elle n’est pas égale à la limite et, si c’est le cas, mettre le thread en pause. Si elle n’est pas pleine, il faut vérifier si la queue est vide (isEmpty()) et, si le thread est vide, appeler la méthode qui libère tous les threads (notifyAll()). Ensuite, ajouter l’élément à la queue.
Pour implémenter take(), il faut vérifier si la queue est vide ; si elle est vide, il faut mettre le thread en pause (car il n’y a rien à lire). Si la queue n’est pas vide, il faut faire une autre vérification pour la complétude de la liste et, si la taille de la liste est égale à la limit, alors libérer tous les threads et retourner le premier élément de la queue (celui qui a été ajouté avant les autres).
Méthodes nécessaires à l'exécution
wait(): met le thread en pause ;notifyAll(): réveille tous les threads en pause ;queue.isEmpty(): vérifie si la file d'attente est vide (true : la file est vide).
Après avoir implémenté ces méthodes et effectué les tests dans la classe Main, rendez-vous dans /src/test/java/BlockingQueueueImplTest.java et exécutez tous les tests.
Si les tests réussissent, félicitations, tout est correct ! Sinon, soit la solution est incorrecte, soit vous avez modifié un élément qui n'aurait pas dû l'être.
Essayez également de résoudre le problème par vous-même, mais si vous n'y parvenez pas et souhaitez connaître la réponse, un lien vers la solution est disponible. Ne copiez pas simplement le code, mais essayez de le comprendre !
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Awesome!
Completion rate improved to 3.33
Défi : File de Blocage
Glissez pour afficher le menu
Tâche
Vous devez simplement implémenter certaines méthodes de BlockingQueue afin de mieux comprendre le fonctionnement de cette collection et d'approfondir la matière !
Vous devez vous rendre dans BlockingQueueueImpl, où la classe contient 2 méthodes non implémentées que vous devrez réaliser vous-même. Il n'est pas nécessaire de proposer une solution complexe, il suffit de reproduire la fonctionnalité d'une BlockingQueueue classique.
Vous disposez également d'une classe Main dans laquelle vous devrez tester votre BlockingQueueueImpl afin de vérifier son bon fonctionnement.
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 l’élément suivant devra attendre qu’il y ait moins d’éléments dans la queue que la limite, puis seulement écrire le prochain élément.
put() - méthode synchronisée qui ajoute des éléments à la queue si la limite de la queue n’est pas dépassée, sinon elle met la queue en pause
take() - méthode synchronisée qui prend un élément de la queue, le retourne et le supprime ; si la queue est vide, elle la met en pause
Astuce de solution
Pour implémenter put(), il faut vérifier si la queue est pleine, c’est-à-dire si elle n’est pas égale à la limite et, si c’est le cas, mettre le thread en pause. Si elle n’est pas pleine, il faut vérifier si la queue est vide (isEmpty()) et, si le thread est vide, appeler la méthode qui libère tous les threads (notifyAll()). Ensuite, ajouter l’élément à la queue.
Pour implémenter take(), il faut vérifier si la queue est vide ; si elle est vide, il faut mettre le thread en pause (car il n’y a rien à lire). Si la queue n’est pas vide, il faut faire une autre vérification pour la complétude de la liste et, si la taille de la liste est égale à la limit, alors libérer tous les threads et retourner le premier élément de la queue (celui qui a été ajouté avant les autres).
Méthodes nécessaires à l'exécution
wait(): met le thread en pause ;notifyAll(): réveille tous les threads en pause ;queue.isEmpty(): vérifie si la file d'attente est vide (true : la file est vide).
Après avoir implémenté ces méthodes et effectué les tests dans la classe Main, rendez-vous dans /src/test/java/BlockingQueueueImplTest.java et exécutez tous les tests.
Si les tests réussissent, félicitations, tout est correct ! Sinon, soit la solution est incorrecte, soit vous avez modifié un élément qui n'aurait pas dû l'être.
Essayez également de résoudre le problème par vous-même, mais si vous n'y parvenez pas et souhaitez connaître la réponse, un lien vers la solution est disponible. Ne copiez pas simplement le code, mais essayez de le comprendre !
Merci pour vos commentaires !