Heim  >  Artikel  >  Java  >  Beispielcode-Analyse der Blockierungswarteschlange BlockingQueue in Java

Beispielcode-Analyse der Blockierungswarteschlange BlockingQueue in Java

黄舟
黄舟Original
2017-04-01 10:30:071555Durchsuche

In diesem Artikel werden hauptsächlich detaillierte Erklärungen und Beispiele zum Blockieren von QueueBlockingQueue in Java vorgestellt Java.

BlockingQueue ist eine gute Lösung für die Übertragung von Daten in Multithreads. Dies ist eine Schnittstelle

Eine ganz besondere Warteschlange. Wenn die BlockQueue leer ist, wird der Vorgang zum Abrufen von Dingen aus der BlockingQueue blockiert und in den Wartestatus

versetzt. Sie wird erst aktiviert, wenn die BlockingQueue etwas eintritt BlockingQueue ist voll, jeder Versuch, es zu speichern, wird ebenfalls blockiert und wechselt in den Wartezustand. Es wird nicht aktiviert, um den Vorgang fortzusetzen, bis in der BlockingQueue Platz ist. Vier Implementierungsklassen von BlockingQueue:

1.ArrayBlockingQueue: BlockingQueue der angegebenen Größe, sein

Konstruktor

Ein int Der Parameter muss verwendet werden, um seine Größe anzugeben. Die darin enthaltenen Objekte werden in der FIFO-Reihenfolge (First In, First Out) sortiert 2. Wenn sein Konstruktor einen Parameter mit einer bestimmten Größe annimmt, hat die generierte BlockingQueue eine Größenbeschränkung. Wenn er keinen Größenparameter annimmt, wird die Größe der generierten BlockingQueue durch Integer.MAX_VALUE bestimmt. Die darin enthaltenen Objekte basieren auf FIFO. First in, first out) )Sequentielle Sortierung

3. PriorityBlockingQueue: Ähnlich wie LinkedBlockQueue, aber die Sortierung der darin enthaltenen Objekte erfolgt nicht nach FIFO, sondern basiert auf der natürlichen Sortierreihenfolge des Objekts bzw. der Reihenfolge bestimmt durch den Komparator des Konstruktors.


4.SynchronousQueue: Eine spezielle BlockingQueue, deren Vorgang abwechselnd durch Putten und Nehmen abgeschlossen werden muss.


Gemeinsame Methoden von BlockingQueue:

1) add(anObject): Füge ein Objekt zur BlockingQueue hinzu, das heißt, wenn die BlockingQueue es aufnehmen kann, gib true zurück, andernfalls wird eine Ausnahme ausgelöst gemeldet

2) offer(anObject): Gibt an, dass, wenn möglich, einObject zur BlockingQueue hinzugefügt wird, d. h., wenn die BlockingQueue es aufnehmen kann, true zurückgeben, andernfalls false zurückgeben

3)put(anObject): Füge einObject zur BlockingQueue hinzu. Wenn in der BlockQueue kein Platz vorhanden ist, wird der Thread, der diese Methode aufruft, blockiert, bis Platz in der BlockingQueue vorhanden ist, bevor fortgefahren wird Sofort raus, Sie können auf die durch den Zeitparameter angegebene Zeit warten. Wenn es nicht herausgenommen werden kann, geben Sie

null


zurück. 5) take(): Nehmen Sie die BlockingQueue weg Das Objekt mit dem ersten Rang wird blockiert, wenn die BlockingQueue leer ist, und tritt in den Wartezustand ein, bis ein neues Objekt zur BlockingQueue hinzugefügt wird.

Beispiel: Dieses Beispiel hauptsächlich Simuliert den Arbeitsablauf zwischen Produzenten und Konsumenten und stellt ein einfaches Szenario dar, bei dem Konsumenten darauf warten, dass Produzenten Produkte produzieren, die die Konsumenten konsumieren.

Produzent:

Verbraucher:

Ausführungsklasse:

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("生产失败");
 }
 
 }
 
 

}
Zuerst ist der Verbraucher

Schleifen , um auf das Produkt zu warten, wenn blockingQueue.take() zum ersten Mal in der Schleife ausgeführt wird, kann kein Produkt abgerufen werden, sodass es zwei Sekunden später in den Blockierungsstatus wechselt Produkt, also Die blockingQueue hat das Produkt abgerufen, das Protokoll gedruckt, und dann hat der Verbraucher die zweite Schleife ausgeführt und festgestellt, dass blockingQueue.take() das Produkt nicht erneut erhalten hat, sodass es erneut in den Blockierungsstatus wechselte. . . Durchlaufen Sie

Das obige ist der detaillierte Inhalt vonBeispielcode-Analyse der Blockierungswarteschlange BlockingQueue 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