Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Défi BlockingQueue | Collections Synchronisées
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 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 votre BlockingQueueueImpl 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 !

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

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