1. Konzept
Das Problem der Produzenten und Verbraucher ist ein Problem der Multi-Thread-Zusammenarbeit in Jindian. Die Produzenten sind für die Herstellung von Produkten und die Lagerung im Lager verantwortlich. Verbraucher erhalten Produkte aus dem Lagerhaus und konsumieren sie. Wenn das Lagerhaus voll ist, muss der Produzent die Produktion stoppen, bis das Produkt aufbewahrt wird. Wenn das Lagerhaus leer ist, muss der Verbraucher den Verbrauch stoppen, bis ein Produkt im Lagerhaus vorhanden ist.
Die folgenden Techniken werden hauptsächlich zur Lösung von Produzenten-/Verbraucherproblemen verwendet: 1. Verwenden Sie Threads, um die Hersteller zu simulieren und Produkte kontinuierlich im Lager in der Laufmethode zu speichern. 2. Verwenden Sie Threads, um die Verbraucher zu simulieren und Produkte kontinuierlich aus dem Lagerhaus in der Run -Methode zu erhalten. 3
Der . Die Lagerklasse spart das Produkt. Wenn die Anzahl der Produkte 0 beträgt, wird die Wartenmethode aufgerufen, wodurch der aktuelle Verbraucher -Thread in einen Wartezustand eingeht. Wenn ein neues Produkt gespeichert wird, wird die Benachrichtigungsmethode aufgerufen, um den wartenden Verbraucher -Thread aufzuwecken. Wenn das Lagerhaus voll ist, wird die Wartenmethode aufgerufen, wodurch der aktuelle Produzenten -Thread in einen Wartezustand eingeht. Wenn ein Verbraucher das Produkt erhält, wird die Benachrichtigungsmethode aufgerufen, um den wartenden Produzenten -Thread aufzuwecken.
2. Beispiele
Paket book this.warehouse = lager; } public void start () {this.running = true; Super.Start (); } public void run () {Produktprodukt; Versuchen Sie {while (laufen) {// Produkte Produkt aus dem Warehouse Product = lager.getProduct (); Schlaf (500); }} catch (interruptedException e) {e.printstacktrace (); }} // Stoppen Sie den Verbraucher -Thread public void stopconsumer () {synchronisiert (Lager) {this.running = false; Warehouse.NotifyAll (); // Thread Benachrichtigen Sie auf das Lagerhaus}} // ob der Verbraucher -Thread öffentlich boolean isrunning () {return running; }} Paket book this.warehouse = lager; } public void start () {this.running = true; Super.Start (); } public void run () {Produktprodukt; // das Produkt produzieren und speichern, try {while (running) {product = new Product ((++ productName)+""); this.warehouse.StorageProduct (Produkt); Schlaf (300); }} catch (interruptedException e) {e.printstacktrace (); }} // Stoppen Sie den Produzenten -Thread public void stopProducer () {synchronisiert (Lager) {this.running = false; // den Thread benachrichtigen, der auf das Warehouse Warehouse Warehouse Warehouse wartet.notifyAll (); }} // Ob der Produzent -Thread public boolean isrunning () {return running; }} Paket book } public String toString () {return "produkt-"+name; }} Paket book int reck = 0; // Index des zuletzt nicht ausgerichteten Produkts im Lagerhaus plus 1 öffentliches Lagerhaus () {this.Products = neues Produkt [Kapazität]; } public lager (int capacity) {this (); if (Kapazität> 0) {Kapazität = Kapazität +1; this.Products = neues Produkt [Kapazität]; }} // Erhalten Sie ein Produkt aus dem Warehouse Public Product GetProduct (). } else {return null; // Nicht der Verbraucher kann das Produkt erhalten} // Wenn der Verbraucher -Thread ausgeführt wird, aber es gibt kein Produkt im Lagerhaus. Der Verbraucher -Thread wartet weiter, während ((vorne == hinten) && Verbraucher) {Wait (); CENSEMERRUNNING = ((Verbraucher) CurrentThread) .isrunning (); } // Wenn der Verbraucher -Thread nicht mehr ausgeführt hat, beenden Sie die Methode und stornieren Sie das Produkt, wenn (! CONSUCTERRUNMING) {return null; } // Erhalten Sie das erste Produkt, das derzeit nicht konsumiert wurde, Produktprodukte = Produkte [vorne]; System.out.println ("Consumer ["+currentThread.getName ()+"] getProduct:"+produkt); // Bewegen Sie das Index des aktuell nicht ausgezeichneten Produkts nacheinander zurück, wenn es das Ende des Arrays erreicht, gehen Sie zur Kopfzeile. System.out.println ("Die Menge der Produkte, die noch im Lager nicht konsumiert werden:"+(hinterher+Kapazitätsront)%Kapazität); // andere wartende Themen benachrichtigen, benachrichtigen Sie (); Rückgabeprodukt; }} // Speichern Sie ein Produkt in das Warehouse public void Speicherprodukt (Produktprodukt) löscht InterruptedException aus {synchronisiert (this) {boolean producterrunning = true; // Signieren Sie, ob der Produzent -Thread Thread thread = Thread.CurrentThread () ausführt; if (aktuelle Thread -Instanz des Produzenten) {producterrunning = ((Produzent) CurrentThread) .isrunning (); } else {return; } // Wenn sich das letzte nicht übertriebene Produkt neben dem Index des ersten nicht ausgezeichneten Produkts befindet, gibt es keinen Speicherplatz. // Wenn es keinen Speicherplatz gibt und der Hersteller -Thread noch läuft, wartet der Produzentfaden darauf, dass das Lager das Produkt freigibt, während ((Rückseite+1)%Kapazität == vorne) && producrunning) {Wait (); producterrunning = ((Produzent) CurrentThread) .isrunning (); } // Wenn der Produktions -Thread nicht mehr ausgeführt hat, wird der Speicher des Produkts gestoppt, wenn (! Producterrunning) {return; } // das Produkt in den Lagerprodukten [hinten] = Produkt speichern; System.out.println ("Produzent [" + thread.currentThread (). GetName () + "] StorageProduct:" + product); // Ändern Sie das hintere Index nacheinander. Hinten = (hinten + 1)%Kapazität; System.out.println ("Die Menge der Produkte, die im Lager nicht konsumiert werden:" + (hintere + Kapazität -front)%Kapazität); benachrichtigen(); }}} Paket book Produzent produzierer2 = neuer Produzent (Lagerhaus, "Produzent-2"); Produzenten produziert3 = neuer Produzent (Lagerhaus, "Produzent-3"); Consumer Consumer1 = neuer Verbraucher (Lagerhaus, "Verbraucher-1"); Consumer Consumer2 = neuer Verbraucher (Lagerhaus, "Verbraucher-2"); Consumer Consumer3 = neuer Verbraucher (Lagerhaus, "Verbraucher-3"); Consumer Consumer4 = neuer Verbraucher (Lagerhaus, "Verbraucher-4"); // Starten Sie den Produzenten -Thread und der Verbraucher -Thread produziert1.Start (); Produzenten2.Start (); Consumer1.Start (); Produzenten3.Start (); Consumer2.Start (); Consumer3.Start (); Consumer4.Start (); // Lassen Sie das Produzent/Verbraucherprogramm für 1600 ms ausführen. } catch (interruptedException e) {e.printstacktrace (); } // Stoppen Sie den Verbraucher -Thread produziert1.stopProducer (); Consumer1.StopConsumer (); Produzenten2.StopProducer (); Consumer2.Stopconsumer (); Produzenten3.StopProducer (); Consumer3.Stopconsumer (); Consumer4.Stopconsumer (); }}Ausgangsergebnis:
Producter [Producter-1] Speicherprodukt: Die Anzahl der Produkte, die im Produkt-1-Lager nicht konsumiert wurden: 1Consumer [Consumer-2] GetProduct: Die Anzahl der Produkte, die nicht im Produkt-1-Lagerhaus konsumiert wurden: 0Producer [Producter-3] -Produkt: Die Anzahl der Produkte, die im Produkt-3-Produkt: 1Product [Product-Produkte produziert wurden: 1Product: 1Product [Product, produziert, produziert, produziert produziert. wurden im Produkt-2-Lager nicht konsumiert: 2Consumer [Consumer-3] GetProduct: Die Anzahl der Produkte, die im Produkt-3-Lager nicht konsumiert wurden: 1Consumer [Consumer-1] GetProduct: Die Anzahl der Produkte, die in der Produkt-2-Produkt-2-Produktion nicht konsumiert wurden: Die Anzahl der Produkte. 1Consumer [Verbraucher-4] GetProduct: Die Anzahl der Produkte, die im Produkt-4-Lager nicht konsumiert wurden: 0Producer [Producter-3] Speicherprodukt: Die Anzahl der Produkte, die nicht im Produkt-6-Lagerhaus konsumiert wurden: 1Producer [Producter-2] -Protokollprodukt: Die Anzahl der Produkte, die nicht im Producer [Producer-2Con-2) 2Con-2Coner-2Coner-2Coner-2-Kobous-2Con-2-Produkte-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-Produkt-2-2-2C-2C-2C-2C-2K-2K-. GetProduct: Die Anzahl der Produkte, die im Produkt-6-Lager nicht konsumiert wurden: 1Consumer [Verbraucher-2] GetProduct: Die Anzahl der Produkte, die im Produkt-5-Lager nicht konsumiert wurden: 0Producer [Productr-1] -Portecuct: Die Anzahl der Produkte, die nicht in Produkten konsumiert wurden. in the Product-7 warehouse: 0Producer[productr-3] storageProduct: The number of products that have not been consumed in the Product-8 warehouse: 1Producer[producer-2] storageProduct:Product-9 Number of products that have not been consumed in the warehouse: 2Consumer[consumer-4] getProduct:Product-8 Number of products that have not been consumed in the warehouse: 1Producer[productr-1] storageProduct:Product-10 Number of products that have not been consumed in the warehouse: 2Producer[productr-3] storageProduct:Product-11 Number of products that have not been consumed in the warehouse: 3Producer[productr-2] storageProduct:Product-12 Number of products that have not been consumed in the warehouse: 4Consumer[consumer-1] getProduct:Product-9 Anzahl der Produkte, die im Lager nicht konsumiert wurden: 3Consumer [Consumer-2] GetProduct: Produkt-10 Anzahl der Produkte, die im Lager nicht konsumiert wurden: 2Consumer [Verbraucher-3] GetProduct: Produkt-11-Anzahl der Produkte, die in der Warenhaus nicht konsumiert wurden. 2Producer [producTtr-1] Speicherprodukt: Produkt-14-Anzahl der Produkte, die im Lager nicht konsumiert wurden: 3Producer [Produzent-2] Speicherprodukt: Produkt-15-Anzahl der Produkte, die im Lager nicht konsumiert wurden: 4Consumenten [Consumer-4] GetProdruct: Produkt-12-Produkt-1-Produkt, die nicht in der Warehouse [Verbrauchshaus (3). Anzahl der Produkte, die im Lager nicht konsumiert wurden: 2Consumer [Consumer-2] GetProduct: Produkt-14 Anzahl der Produkte, die im Lager nicht konsumiert wurden: 1Producer [protoustr-1] StorageProduct: Product-16-Anzahl der Produkte, die in den Produkten nicht konsumiert wurden, in der Produkt-2-Produkte, die in den Produkten nicht konsumiert wurden, in der Produkt-1-Producer-Anzahl der Produkte, die in der Produktion nicht konsumiert wurden: Die Produkt-1-Product-Anzahl von Produkten, die in den Produkten produziert wurden: Die Produktion, die in der Produktion, die in der Produktion, in der produziert wurde, in der Lagerung (Producer-3] -Artrodukte, mit der Producer-Storate: Producer-Story-Product: Product: Producer, die in der Producer-Storate verwendet wurden, haben in der Produkt-1-Product-Anzahlung nicht konsumiert. 3Producer [producTtr-2] Speicherprodukt: Anzahl der Produkte, die im Produkt-18-Lager nicht konsumiert wurden: 4
Analyse: In der Hauptmethode wird ein Produktlager festgelegt, und das Lager verbindet keine 3 Produzentenfäden und 4 Verbraucherfäden. Diese Themen werden damit begonnen, den Hersteller/Verbrauchermodell zum Laufen zu bringen. Wenn das Programm für 1600 ms läuft, hören alle Hersteller ein, Produkte zu produzieren, und Verbraucher stoppen die Konsum von Produkten.
Das Hersteller -Thread -Produkt produziert ein Produkt ohne 300 ms in der Laufmethode und speichert es im Lagerhaus. Der Verbraucher -Thread -Verbraucher nimmt ein Produkt aus dem Lagerhaus ohne 500 ms in der Run -Methode.
Warehouse ist für die Aufbewahrung und Verteilung von Produkten verantwortlich. Die Speicherproduktmethode ist für die Speicherung des Produkts verantwortlich. Wenn das Lagerhaus voll ist, tritt der aktuelle Thread in einen Wartezustand ein, dh wenn der Produzenten -Faden A die Speicherproduktmethode zum Speichern des Produkts aufruft, wird festgestellt, dass das Lagerhaus voll ist und nicht gespeichert werden kann. Es wird in einen Wartezustand gelangen. Wenn das Speicherprodukt erfolgreich ist, wird die Benachrichtigungsmethode aufgerufen, um den wartenden Verbraucher -Thread aufzuwecken.
Die GetProduct -Methode ist im Voraus für das Produkt verantwortlich. Wenn das Lagerhaus leer ist, tritt der aktuelle Thread in einen Wartezustand ein. Das heißt, wenn Verbraucher -Thread B die GetProduct -Methode aufruft, um das Produkt zu erhalten, wird festgestellt, dass das Lagerhaus leer ist, und tritt in einen Wartezustand ein. Wenn das Produkt erfolgreich extrahiert wird, wird die Benachrichtigungsmethode aufgerufen, um den wartenden Produzenten -Thread aufzuwecken.
In dem obigen Artikel werden die Probleme von Produzenten und Verbrauchern in Java -Threads kurz erörtert, dass der Inhalt, den ich mit Ihnen teile,. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.