Simulación del clásico problema productor-consumidor. Este programa simula el caso más simple: el almacenamiento en búfer único. Para simular la situación real, se agrega un retraso al consumir y producir artículos. Puede simular diferentes tasas de generación y consumo modificando el retraso.
[código]
[/co/**
* problema consumidor-productor de buffer único.
* por xu([email protected]).
* */
clase pública ProductorConsumidor {
Búfer de objeto estático = nulo;
objeto estático mutex = nuevo objeto();
Objeto estático condConsumer = nuevo Objeto();
Objeto estático condProducer = nuevo Objeto();
público estático vacío principal (String [] argumentos) {
Productor de hilo = nuevo hilo() {
ejecución pública vacía() {
//para(int i=0; i<10; i++) {
para(int i=0; ; i++) {
// producir artículo.
intentar {
Hilo.dormir(1000);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
Elemento de cadena = nueva cadena ("elemento-" + i);
System.out.println("[productor] produjo " + elemento);
// espera a que el buffer esté vacío.
sincronizado (condProductor) {
mientras (búfer! = nulo) {
intentar {
condProductor.wait();
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
}
}
// poner el elemento en el buffer.
sincronizado (mutex) {
buffer = elemento;
System.out.println("[productor] coloque " + elemento + " en el búfer.");
}
// notificar a los consumidores.
sincronizado (condConsumer) {
condConsumer.notify();
}
}
}
};
Consumidor de hilos = nuevo hilo() {
ejecución pública vacía() {
//para(int i=0; i<10; i++) {
para( ; ; ) {
// espera a que llegue el artículo.
sincronizado (condConsumer) {
mientras (búfer == nulo) {
intentar {
condConsumer.wait();
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
}
}
// obtener elemento del buffer.
Elemento de cadena = nulo;
sincronizado (mutex) {
elemento = (Cadena)búfer;
búfer = nulo;
System.out.println(" [consumidor] obtiene " + elemento + " del búfer.");
}
// consumir artículo.
intentar {
Hilo.dormir(500);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
System.out.println(" [consumidor] consumido " + elemento);
// notificar a los productores.
sincronizado (condProductor) {
condProducer.notify();
}
}
}
};
consumidor.start();
productor.start();
}
}Delaware]