Simulation des klassischen Produzenten-Konsumenten-Problems. Dieses Programm simuliert den einfachsten Fall – Einzelpufferung. Um die tatsächliche Situation zu simulieren, wird eine Verzögerung beim Verbrauch von Artikeln und bei der Produktion von Artikeln hinzugefügt. Sie können unterschiedliche Erzeugungs- und Verbrauchsraten simulieren, indem Sie die Verzögerung ändern.
[Code]
[/co/**
* Einzelpuffer-Konsumenten-Produzenten-Problem.
* von xu([email protected]).
* */
öffentliche Klasse ConsumerProducer {
statischer Objektpuffer = null;
static Object mutex = new Object();
statisches Objekt condConsumer = new Object();
statisches Objekt condProducer = new Object();
public static void main(String[] args) {
Thread-Produzent = neuer Thread() {
public void run() {
//for(int i=0; i<10; i++) {
for(int i=0; ; i++) {
// Artikel produzieren.
versuchen {
Thread.sleep(1000);
} Catch (InterruptedException e) {
e.printStackTrace();
}
String item = new String("item-" + i);
System.out.println("[Produzent] produziert " + item);
// warte, bis der Puffer leer ist.
synchronisiert (condProducer) {
while(buffer != null) {
versuchen {
condProducer.wait();
} Catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Element in den Puffer legen.
synchronisiert (Mutex) {
Puffer = Element;
System.out.println("[producer] put " + item + " to buffer.");
}
// Verbraucher benachrichtigen.
synchronisiert (condConsumer) {
condConsumer.notify();
}
}
}
};
Thread-Verbraucher = neuer Thread() {
public void run() {
//for(int i=0; i<10; i++) {
für( ; ; ) {
// warte auf das Eintreffen des Artikels.
synchronisiert (condConsumer) {
while( buffer == null ) {
versuchen {
condConsumer.wait();
} Catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Element aus Puffer holen.
String-Element = null;
synchronisiert (Mutex) {
item = (String)buffer;
Puffer = null;
System.out.println(" [consumer] get " + item + " from buffer.");
}
// Artikel verbrauchen.
versuchen {
Thread.sleep(500);
} Catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" [consumer] comsumed " + item);
// Produzenten benachrichtigen.
synchronisiert (condProducer) {
condProducer.notify();
}
}
}
};
Consumer.start();
Produzent.start();
}
}de]