Maison  >  Article  >  Java  >  Exemple d'analyse de code de la file d'attente de blocage BlockingQueue en Java

Exemple d'analyse de code de la file d'attente de blocage BlockingQueue en Java

黄舟
黄舟original
2017-04-01 10:30:071572parcourir

Cet article présente principalement l'explication détaillée et des exemples de blocage de file d'attenteBlockingQueue en Java. Les amis qui en ont besoin peuvent se référer à

explication détaillée et exemples de blocage de file d'attente BlockingQueue dans. java.

BlockingQueue est une bonne solution pour la transmission de données en multi-threads. Tout d'abord, BlockingQueue est une interface. une file d'attente très spéciale. Si la BlockQueue est vide, l'opération de récupération des éléments de la BlockingQueue sera bloquée et entrera dans l'état d'attente , et elle ne sera réveillée que lorsque la BlockingQueue entrera dans quelque chose. BlockingQueue est plein, toute tentative de sauvegarde le fonctionnement des choses sera également bloqué et entrera dans l'état d'attente. Il ne sera pas réveillé pour continuer l'opération tant qu'il n'y aura pas d'espace dans BlockingQueue.

Quatre classes d'implémentation de BlockingQueue :

1.ArrayBlockingQueue : BlockingQueue de taille spécifiée, son constructeur Un int le paramètre doit être pris pour indiquer sa taille. Les objets qu'il contient sont triés dans l'ordre FIFO (premier entré, premier sorti)

2. si son constructeur prend un paramètre avec une taille spécifiée, la BlockingQueue générée a une limite de taille. S'il ne prend pas de paramètre de taille, la taille de la BlockingQueue générée est déterminée par Integer.MAX_VALUE. Les objets qu'elle contient sont basés sur FIFO (. premier entré, premier sorti) )Tri séquentiel

3. PriorityBlockingQueue : similaire à LinkedBlockQueue, mais le tri des objets qu'il contient n'est pas FIFO, mais basé sur l'ordre de tri naturel de l'objet ou du ordre déterminé par le Comparator du constructeur.

4.SynchronousQueue : Une BlockingQueue spéciale, dont le fonctionnement doit être effectué alternativement en mettant et en prenant.

Méthodes courantes de BlockingQueue :

1) add(anObject) : Ajoutez un objet à BlockingQueue, c'est-à-dire que si BlockingQueue peut l'accueillir, retournez true, sinon une exception sera rapporté

2) offer(anObject ) : indique que si possible, ajoutez un objet à BlockingQueue, c'est-à-dire que si BlockingQueue peut l'héberger, renvoyez true, sinon renvoyez false

3)put(anObject) : Ajoutez un objet au BlockingQueue, s'il n'y a pas d'espace dans le BlockQueue, le thread appelant cette méthode est bloqué jusqu'à ce qu'il y ait de l'espace dans le BlockingQueue avant de continuer. Si le premier objet ne peut pas être pris. immédiatement, vous pouvez attendre le temps spécifié par le paramètre time. S'il ne peut pas être retiré, retournez

null

5) take() : supprimez la BlockingQueue. L'objet de premier rang, si la BlockingQueue est vide, est bloqué et entre dans l'état d'attente jusqu'à ce qu'un nouvel objet soit ajouté au Blocking Exemple :

Cet exemple est principalement simulé Le flux de travail entre producteurs et consommateurs est un scénario simple dans lequel les consommateurs attendent que les producteurs produisent des produits que les consommateurs peuvent consommer.

Producteur :

Consommateur :

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

}
Classe d'exécution :

Le premier est le consommateur

boucles
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("取出失败");
  }
 }
 }

}
pour attendre le produit. Lorsque blockingQueue.take() est exécuté pour la première fois dans la boucle, aucun produit ne peut être obtenu, il entre donc dans l'état de blocage deux secondes plus tard, le producteur produit un. produit, donc BlockingQueue a obtenu le produit, a imprimé le journal, puis le consommateur a exécuté la deuxième boucle et a constaté que blockingQueue.take() n'a pas récupéré le produit, il est donc entré à nouveau dans l'état de blocage. . . Parcourez

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn