Contenu du cours
Multithreading en Java
Multithreading en Java
Producteur-Consommateur
Bon travail ! Vous avez parcouru un long chemin, et nous avons exploré beaucoup de théorie et d'exemples pratiques !
Vous avez peut-être rencontré le modèle Producer-Consumer
dans d'autres sections, mais vous ne l'avez peut-être pas réalisé. Dans cette section, nous en discuterons en détail, et si quelque chose des exemples précédents n'était pas clair, cela deviendra clair dans cette section !
Le modèle Producer-Consumer
implique deux types de threads, qui sont clairs d'après le nom : Producer et Consumer.
Le Producer
produira des données qu'il mettra dans un tampon/queue partagé auquel le Consumer
a également accès, et il se contentera de consommer ces données depuis l'emplacement de stockage des données.
Remarque
Le principal objectif du modèle est de séparer la production et la consommation de données, permettant aux producteurs de fonctionner indépendamment des consommateurs.
Où il est utilisé
Ce modèle est couramment employé dans les systèmes où un traitement de données asynchrone est requis. Nous explorerons en détail ce que signifie asynchrony
plus tard.
En pratique, ce modèle est fréquemment utilisé pour les systèmes de traitement d'événements, la journalisation des données, la gestion des requêtes réseau et le traitement parallèle des données.
Imaginez un tapis roulant dans une usine où un ouvrier place des pièces sur le tapis roulant (producteur), et un autre ouvrier les retire et les assemble en un produit (consommateur). Le producteur et le consommateur peuvent fonctionner à des vitesses différentes, mais le tapis roulant (tampon) les aide à rester synchronisés.
À quoi cela ressemble-t-il dans le code ?
Considérons un exemple d'utilisation de BlockingQueue
pour implémenter le modèle Producer-Consumer
.
Remarque
Vous pouvez basculer entre les onglets, et c'est ainsi que vous accéderez au code dont vous avez besoin.
ExampleProducerConsumer
Consumer
Producer
public class ExampleProducerConsumer { public static void main(String[] args) { BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); // Shared queue Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start(); // Start producer thread consumerThread.start(); // Start consumer thread } }
Ce programme illustre le modèle Producer-Consumer
en utilisant BlockingQueue
pour assurer des interactions sûres entre les threads.
Une BlockingQueue
est établie pour agir comme un tampon partagé pour les threads Producer
et Consumer
.
La classe Producer
génère des nombres de 0 à 9 et les ajoute à la queue, puis place une valeur de signalisation de -1 pour indiquer que la production est terminée.
La classe Consumer
récupère à plusieurs reprises des nombres de la queue. Lorsqu'elle rencontre la valeur de signalisation -1, elle cesse de consommer.
Dans la méthode principale, la queue partagée est initialisée, et les threads producer et consumer sont créés et démarrés. Le Producer
ajoute des éléments à la queue tandis que le Consumer
traite ces éléments.
Pourquoi est-il utilisé ?
Le modèle Producer-Consumer
est utilisé pour accomplir plusieurs objectifs :
- Synchronisation des threads : Permet aux threads d'échanger des données de manière sécurisée ;
- Amélioration des performances : Les producteurs et les consommateurs peuvent travailler en parallèle sans se bloquer mutuellement ;
- Mise en tampon : Le tampon aide à équilibrer les différences de vitesse entre la production et la consommation.
Remarque
Le modèle
Producer-Consumer
aide à organiser une interaction sûre et efficace entre les threads dans la programmation multithread. Il permet aux producteurs et aux consommateurs de travailler indépendamment en utilisant un tampon pour la synchronisation, ce qui améliore les performances et prévient le blocage.
1. Quel rôle remplit la classe Producer dans le modèle Producer-Consumer ?
2. Que fait la valeur de signal -1 dans le programme d'exemple donné ?
Merci pour vos commentaires !