Maison > Java > javaDidacticiel > Explication détaillée d'exemples de producteurs et de consommateurs Java

Explication détaillée d'exemples de producteurs et de consommateurs Java

Y2J
Libérer: 2017-05-06 13:22:53
original
1845 Les gens l'ont consulté

Cet article analyse principalement la méthode du problème producteur-consommateur en Java avec des exemples. Les amis qui en ont besoin peuvent s'y référer

Le problème producteur et consommateur est un problème classique dans le modèle thread : producteur et consommateurs. partagent le même espace de stockage pendant la même période. Comme le montre la figure ci-dessous, le producteur stocke les données dans l'espace et le consommateur récupère les données. S'il n'y a pas de coordination, les situations suivantes peuvent se produire :

. Stockage L'espace est plein et les producteurs l'occupent. Les consommateurs attendent que les producteurs libèrent de l'espace et retirent ainsi des produits. Les producteurs attendent que les consommateurs consomment des produits, ajoutant ainsi des produits à l'espace. Attendez-vous les uns les autres, ce qui entraîne une impasse.


L'exemple suivant montre comment résoudre le problème producteur/consommateur via des threads :

/*
 author by w3cschool.cc
 ProducerConsumerTest.java
 */
public class ProducerConsumerTest {
  public static void main(String[] args) {
   CubbyHole c = new CubbyHole();
   Producer p1 = new Producer(c, 1);
   Consumer c1 = new Consumer(c, 1);
   p1.start(); 
   c1.start();
  }
}
class CubbyHole {
  private int contents;
  private boolean available = false;
  public synchronized int get() {
   while (available == false) {
     try {
      wait();
     }
     catch (InterruptedException e) {
     }
   }
   available = false;
   notifyAll();
   return contents;
  }
  public synchronized void put(int value) {
   while (available == true) {
     try {
      wait();
     }
     catch (InterruptedException e) { 
     } 
   }
   contents = value;
   available = true;
   notifyAll();
  }
}
class Consumer extends Thread {
  private CubbyHole cubbyhole;
  private int number;
  public Consumer(CubbyHole c, int number) {
   cubbyhole = c;
   this.number = number;
  }
  public void run() {
   int value = 0;
     for (int i = 0; i < 10; i++) {
      value = cubbyhole.get();
      System.out.println("消费者 #" + this.number+ " got: " + value);
     }
  }
}
class Producer extends Thread {
  private CubbyHole cubbyhole;
  private int number;
  public Producer(CubbyHole c, int number) {
   cubbyhole = c;
   this.number = number;
  }
  public void run() {
   for (int i = 0; i < 10; i++) {
     cubbyhole.put(i);
     System.out.println("生产者 #" + this.number + " put: " + i);
     try {
      sleep((int)(Math.random() * 100));
     } catch (InterruptedException e) { }
   }
  }
}
Copier après la connexion

Le résultat de l'exécution du code ci-dessus est :

消费者 #1 got: 0
生产者 #1 put: 0
生产者 #1 put: 1
消费者 #1 got: 1
生产者 #1 put: 2
消费者 #1 got: 2
生产者 #1 put: 3
消费者 #1 got: 3
生产者 #1 put: 4
消费者 #1 got: 4
生产者 #1 put: 5
消费者 #1 got: 5
生产者 #1 put: 6
消费者 #1 got: 6
生产者 #1 put: 7
消费者 #1 got: 7
生产者 #1 put: 8
消费者 #1 got: 8
生产者 #1 put: 9
消费者 #1 got: 9
Copier après la connexion

[Recommandations associées]

1 Tutoriel vidéo gratuit Java

2.

Tutoriel vidéo Java de la Geek Academy

3

Tutoriel de développement FastJson.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal