Copie el código de código de la siguiente manera:
condición del paquete;
importar java.util.ArrayList;
importar java.util.List;
importar java.util.concurrent.locks.Condition;
importar java.util.concurrent.locks.Lock;
importar java.util.concurrent.locks.ReentrantLock;
/**
* Utilice Lock and Condition para implementar el modelo productor-consumidor
* @autor lo hará
*
*/
clase pública ProducerConsumerDemo {
público estático vacío principal (String [] argumentos) {
int productorCount = 10;
int consumidorCount = 15;
final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5); // El tamaño del búfer es 5;
Hilo[] productorThreads = nuevo Hilo[productorCount];
for(int i = 0; i < productorCount; i++) {
productorThreads[i] = nuevo hilo("productor" + (i+1)) {
@Anular
ejecución pública vacía() {
pcd.producir();
}
};
}
Thread[] consumerThreads = nuevo Thread[consumerCount];
for(int j = 0; j < consumerCount; j++) {
hilosdeconsumidor[j] = nuevo hilo("consumidor" + (j+1)) {
@Anular
ejecución pública vacía() {
pcd.consumir();
}
};
}
//Iniciar el hilo productor consumidor
for(int i = 0; i < productorCount; i++) {
productorThreads[i].start();
}
for(int j = 0; j < consumerCount; j++) {
consumerThreads[j].start();
}
}
int final estático privado DEFAULT_BUFFER_SIZE = 10;
private int bufferSize; // tamaño del búfer
lista privada<Objeto> lista de búfer;
bloqueo final privado = nuevo ReentrantLock (verdadero);
Condición final privada condición = lock.newCondition();
public ProducerConsumerDemo(int bufferSize) {
this.bufferSize = bufferSize > 0? bufferSize: DEFAULT_BUFFER_SIZE;
bufferList = new ArrayList<Objeto>(bufferSize);
}
// Producción
producir vacío público () {
lock.lock(); // bloquear
intentar {
while(bufferList.size() == bufferSize) { // El buffer está lleno
System.out.println("Productor espera, hilo: " + Thread.currentThread().getName());
condición.await();
}
// Producción
bufferList.add(nuevo Objeto());
System.out.println("El productor produce uno, ahora tamaño del búfer: "
+ bufferList.size() + ", y hilo: " + Thread.currentThread().getName());
condition.signalAll(); // Notificar a los consumidores
} captura (Excepción interrumpida e) {
e.printStackTrace();
} finalmente {
bloquear.desbloquear();
}
}
// Consumo
consumo público vacío() {
lock.lock(); // bloquear
intentar {
while(bufferList.isEmpty()) { // El buffer está vacío
System.out.println("Espera del consumidor, hilo: " + Thread.currentThread().getName());
condición.await();
}
// Consumo
bufferList.remove(0); // Elimina uno del encabezado de la lista vinculada.
System.out.println("Consumidor consumidor uno, ahora tamaño de búfer: "
+ bufferList.size() + ", y hilo: " + Thread.currentThread().getName());
condición.signalAll();
} captura (Excepción interrumpida e) {
e.printStackTrace();
} finalmente {
bloquear.desbloquear();
}
}
}