Latest web development tutorials

Java Beispiele - Erzeuger / Verbraucher-Problem

Java Beispiele Java Beispiele

Erzeuger- und Verbraucherfragen sind Modell klassisches Problem Gewinde: Produzenten und Konsumenten im gleichen Zeitraum die gleiche Speicherraum, wie unten dargestellt, an Hersteller von Datenspeicherplatz, und die Verbraucher Zugang zu den Daten, wenn nicht Koordination können die folgenden Bedingungen auftreten:

Der Speicher ist voll, und Produzenten besetzen sie, für den Hersteller Warteraum zu machen für den Verbraucher das Produkt zu entfernen, den Hersteller von Produkten für die Konsumausgaben warten, damit das Hinzufügen zu den Produktraum. Warten auf einander, so dass ein Deadlock auftritt.

Java Beispiele - Erzeuger / Verbraucher-Problem

Das folgende Beispiel demonstriert, wie der Erzeuger / Verbraucher-Problem durch Thread zu lösen:

/*
 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) { }
      }
   }
}

Der obige Code ausgeführt wird, ausgegeben wird:

消费者 #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

Java Beispiele Java Beispiele