Java-Beispiele - Producer/Consumer-Problem
Das Erzeuger-Verbraucher-Problem ist ein klassisches Problem in Threading-Modellen: Erzeuger und Verbraucher teilen sich denselben Speicherplatz im selben Zeitraum. Wie in der folgenden Abbildung dargestellt, speichert der Erzeuger Daten in den Speicherplatz, während der Verbraucher Daten entnimmt. Wenn nicht koordiniert, kann die folgende Situation auftreten:
Der Speicherplatz ist voll und der Erzeuger belegt ihn; der Verbraucher wartet darauf, dass der Erzeuger Platz freigibt, um Produkte zu entnehmen, während der Erzeuger darauf wartet, dass der Verbraucher Produkte konsumiert, damit er Produkte zum Speicherplatz hinzufügen kann. Sie warten aufeinander, was zu einem Deadlock führt.

Das folgende Beispiel zeigt, wie das Erzeuger/Verbraucher-Problem mit Threads gelöst wird:
Beispiel
Autor von example.com
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 {
warten();
}
catch (InterruptedException e) {
}
}
available = false;
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
warten();
}
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("Verbraucher #" + this.number+ " erhielt: " + 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("Producer #" + this.number + " put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
Die Ausgabe beim Ausführen des obigen Codes ist:
消费者 #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: 9Andere Erweiterungen
Java-Beispiele