Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der BlockingQueue-Beispiele für Blockierungswarteschlangen in Java

Detaillierte Erläuterung der BlockingQueue-Beispiele für Blockierungswarteschlangen in Java

Y2J
Y2JOriginal
2017-04-27 09:37:421688Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung und Beispiele der Blockierungswarteschlange BlockingQueue in Java vor. Freunde, die es benötigen, können sich auf

Detaillierte Erklärung und Beispiele der Blockierungswarteschlange BlockingQueue in Java beziehen

BlockingQueue ist eine gute Lösung für die Übertragung von Daten in Multithreads. Es handelt sich um eine ganz besondere Warteschlange Das Abrufen von Dingen aus der BlockingQueue erfolgt blockiert und tritt in den Wartezustand ein und wird nicht aktiviert, bis die BlockingQueue etwas enthält. Wenn die BlockingQueue ebenfalls voll ist, wird auch jede Operation blockiert, die versucht, etwas darin zu speichern und tritt in den Wartezustand ein und wird erst dann aktiviert, wenn Platz in der BlockingQueue vorhanden ist, um den Vorgang fortzusetzen.

Vier Implementierungsklassen von BlockingQueue:

1.ArrayBlockingQueue: Sein Konstruktor muss einen int-Parameter annehmen, um seine Größe anzugeben werden in der FIFO-Reihenfolge (First In, First Out) sortiert.

2. LinkedBlockingQueue: BlockingQueue mit variabler Größe. Wenn kein Größenparameter vorhanden ist, wird die Größe der generierten BlockingQueue durch Integer.MAX_VALUE bestimmt. Die darin enthaltenen Objekte werden in der FIFO-Reihenfolge (First In, First Out) sortiert

3.PriorityBlockingQueue: ähnlich zu LinkedBlockQueue, aber die Sortierung der darin enthaltenen Objekte erfolgt nicht nach FIFO, sondern basiert auf der natürlichen Sortierreihenfolge der Objekte oder der durch den Komparator des Konstruktors festgelegten Reihenfolge

4.SynchronousQueue: a spezielle BlockingQueue, für die Der Vorgang muss abwechselnd durch Putten und Nehmen abgeschlossen werden.

Allgemeine Methoden von BlockingQueue:

1) add(anObject): Füge einObjekt zum hinzu BlockingQueue, das heißt, wenn die BlockingQueue untergebracht werden kann, geben Sie true zurück, andernfalls wird eine Ausnahme gemeldet

2) offer(anObject): Gibt an, dass, wenn möglich, einObject zur BlockingQueue hinzugefügt werden soll. Das heißt, wenn die BlockingQueue es aufnehmen kann, geben Sie true zurück, andernfalls geben Sie false zurück. 3)put(anObject): Füge ein Objekt zur BlockingQueue hinzu, wenn der Thread dies aufruft Methode wird blockiert, bis Platz in der BlockingQueue ist, bevor Sie fortfahren

4)poll(time): Entfernen Sie das erste Objekt in der BlockingQueue, können Sie warten für die durch den Zeitparameter angegebene Zeit, null zurückgeben

5)take(): Nimm das erste Objekt in der BlockingQueue. Wenn die BlockingQueue leer ist, wird der Block gelöscht Gehen Sie in den Wartezustand, bis neue Objekte zur Blockierung hinzugefügt werden.

Beispiel:

Dieses Beispiel simuliert hauptsächlich den Arbeitsablauf zwischen Produzenten und Konsumenten Warten Sie darauf, dass die Produzenten Produkte herstellen, die die Verbraucher konsumieren können.

Produzent:

Verbraucher:
package com.gefufeng;
import java.util.concurrent.BlockingQueue;

public class Producter implements Runnable{
 private BlockingQueue<String> blockingQueue;
 
 public Producter(BlockingQueue<String> blockingQueue){
 this.blockingQueue = blockingQueue;
 }

 @Override
 public void run() {
 try {
  blockingQueue.put("我生产的" + Thread.currentThread().getName());
  System.out.println("我生产的" + Thread.currentThread().getName());
 } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  System.out.println("生产失败");
     }
 }
}

Ausführungsklasse:

package com.gefufeng;
import java.util.concurrent.BlockingQueue;
public class Customer implements Runnable{
 private BlockingQueue<String> blockingQueue;
 public Customer(BlockingQueue<String> blockingQueue){
 this.blockingQueue = blockingQueue;
 }
 @Override
 public void run() {
 for(;;){
  try {
  String threadName = blockingQueue.take();
  System.out.println("取出:" + threadName);
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  System.out.println("取出失败");
  }
 }
 }
}

Zuerst ist der Verbraucher Wartet in einer Schleife auf das Produkt. Wenn blockingQueue.take() zum ersten Mal in der Schleife ausgeführt wird, kann kein Produkt abgerufen werden, sodass der Produzent zwei Sekunden später ein Produkt erzeugt, also die blockingQueue Ruft das Produkt ab und druckt es aus. Nach dem Lesen des Protokolls führte der Verbraucher die zweite Schleife aus und stellte fest, dass blockingQueue.take() das Produkt nicht erneut erhielt, sodass es erneut in den Blockierungsstatus wechselte. . . Durchlaufen Sie

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der BlockingQueue-Beispiele für Blockierungswarteschlangen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn