Plusieurs façons de mettre en œuvre le modèle de producteur et de consommation
Prenez l'exemple de nos vies comme exemple. Les produits produits par les usines sont toujours exportés pour être utilisés à l'extérieur. C'est le concept de production et de consommation.
Dans notre processus de développement logiciel réel, nous rencontrons souvent les scénarios suivants: un module est responsable de la génération de données, et ces données sont traitées par un autre module (le module ici est généralisé, qui peut être des classes, des fonctions, des threads, des processus, etc.).
Le module qui génère des données est très bien appelé producteur; tandis que le module qui traite les données est appelé consommateur.
Le premier type: utilisez l'attente pour implémenter le modèle producteur et consommateur
1. Un producteur et un consommateur:
2. Un producteur et plusieurs consommateurs:
Le deuxième type: utiliser des files d'attente de blocage pour implémenter le modèle producteur et consommateur
3. Utilisez des files d'attente de blocage pour implémenter
Je crois que tout le monde est allé à la cuisine japonaise. Il y a un repas très attrayant qui est du barbecue. Le maître de barbecue se tiendra sur le côté et gardera le barbecue, puis mettra la viande rôtie dans une assiette; Et nous, les convives qui bave nous resterons sur le côté, et nous continuerons à manger tant qu'il y a de la viande dans l'assiette.
Dans ce cas de vie, le maître de barbecue est le producteur et il est responsable du barbecue. Après la torréfaction, il met la viande sur l'assiette au lieu de la remettre directement au restaurant (c'est-à-dire qu'il n'est pas nécessaire de notifier le restaurant pour manger de la viande). Si la viande dans l'assiette est pleine, le maître s'arrêtera pendant un certain temps jusqu'à ce que quelqu'un va manger le barbecue avant de produire la viande; Et les convives regardent simplement l'assiette, et une fois qu'il y a de la viande dans l'assiette, nous sommes responsables de le manger;
Pendant tout le processus, les convives et le maître de barbecue ne se sont pas traités directement les uns avec les autres, mais ont interagi avec l'assiette.
La plaque agit comme un concept tampon. Si quelque chose est produit, mettez-le. La plaque a également une limite de taille. S'il dépasse la taille de la plaque, il bloquera la production du producteur et attendra que le consommateur consomme; Lorsque la plaque est vide, elle bloquera la consommation des consommateurs et attendra que le producteur produit.
Le blocage de la file d'attente pendant la programmation peut réaliser la fonction du disque.
Caractéristiques du blocage des files d'attente:
Lorsque l'élément de file d'attente est plein, bloquez l'opération d'insertion;
Lorsque l'élément de file d'attente est vide, l'opération d'acquisition est bloquée.
ArrayBlockingQueue et LinkedBlockingQueue prennent en charge FIFO (premier dans, premier sorti), mais LinkedBlockingQueue est illimité, tandis que ArrayBlockingQueue est délimité.
Ce qui suit utilise des files d'attente de blocage pour mettre en œuvre les producteurs et les consommateurs:
Producteur:
Importer java.util.concurrent.blockingQueue; Le producteur de classe publique implémente Runnable {private final blockerQueue BlockingQueue; // définir la taille du cache de file d'attente. La production sera temporairement arrêtée après avoir dépassé cette taille pendant le processus de production. Private Final int queue_size = 10; Producteur public (BlockingQueue BlockingQueue) {this.blockingQueue = BlockingQueue;} int task = 1; @Override public void run () {while (true) {try {System.out.printLnn ("Production:" + tâche); // Pour faciliter la visualisation de l'effet thread.sleep (1000);} catch (InterruptedException e) {e.printStackTrace ();}}}}consommateur:
Importer java.util.concurrent.blockingqueue; // Consumer classe publique Implémentés Consalés Runnable {private final BlockerQueue BlockingQueue; public Consumer (BlockingQueue BlockingQueue) {this.blockerQueue = BlockingQueue;} @ Override Vend Run () {// TRAIN {System.out.println ("Consuring:" + BlockerQueue.Take ()); // Laissez s'arrêter pendant un certain temps pour faciliter la visualisation de l'effet thread.sleep (2000);} catch (InterruptedException e) {e.printStackTrace ();}}}}}test:
Importer java.util.concurrent.blockingqueue; import java.util.concurrent.linkedblockingqueue; / ** * Mode consommateur producteur * Utiliser Blocking Queue BlockingQueue * @Author Wanggenshen * * / public class TestConpro {public static Void Main (String [] Args) {BlockqueeUe Blockingquee) = nouveau producteur (BlockingQueue); Consumer C = nouveau consommateur (BlockingQueue); thread tp = nouveau thread (p); thread tc = nouveau thread (c); tp.start (); tc.start ();}}Parce que LinkedBlockingQueue est une file d'attente illimité, les producteurs continueront de produire, de mettre les tâches produites dans la file d'attente et les consommateurs consommeront dans la file d'attente:
Si vous utilisez à la place la file d'attente de blocage bornée à la place, vous pouvez initialiser la taille de la file d'attente. Ensuite, lorsque les éléments de la file d'attente dépassent la taille de la file d'attente, le producteur attendra que le consommateur en consomme l'un puis produise l'autre:
Code de test:
Initialisez un arrayblockingqueue de taille 10:
public static void main (String [] args) {BlockerQueue BlockingQueue = new ArrayBlockingQueue (10); producteur p = nouveau producteur (BlockingQueue); Consumer C = nouveau consommateur (BlockingQueue); Thread TP = nouveau thread (P); Thread TC = nouveau Thread (C); TP.start (); tc.Start ();}Pendant le test, les producteurs ont été autorisés à produire un peu plus rapidement, tandis que les consommateurs étaient plus lents. Vous pouvez voir que la différence entre le numéro de série produit produit et le numéro de série du produit consommé est toujours de 10 (la taille de la file d'attente):
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur la méthode de mise en œuvre du modèle de consommation de production et les exemples de code de problèmes de sécurité des threads. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!