Ejemplo de Java - Problema del productor/consumidor
El problema del productor y el consumidor es un problema clásico en el modelo de hilos: el productor y el consumidor comparten el mismo espacio de almacenamiento durante el mismo período de tiempo. Como se muestra en la siguiente figura, el productor almacena datos en el espacio, mientras que el consumidor los utiliza. Si no se coordinan, pueden ocurrir las siguientes situaciones:
El espacio de almacenamiento está lleno y el productor lo ocupa; el consumidor espera que el productor libere el espacio para retirar el producto, mientras que el productor espera que el consumidor consuma el producto para agregarlo al espacio. Se esperan mutuamente, lo que provoca un punto muerto.

El siguiente ejemplo demuestra cómo resolver el problema del productor/consumidor mediante hilos:
Ejemplo
author by 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 {
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(Consumidor # + 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(Productor # + this.number + " put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
El resultado de ejecutar el código anterior es:
消费者 #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: 9Otras extensiones
Ejemplo de Java