Copie o código do código da seguinte forma:
condição da embalagem;
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;
/**
* Use Lock and Condition para implementar o modelo produtor-consumidor
* @autor irá
*
*/
classe pública ProdutorConsumidorDemo {
public static void main(String[] args) {
int quantidade de produtores = 10;
intconsumidorCount = 15;
final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5); // O tamanho do buffer é 5;
Thread[] produtorThreads = new Thread[producerCount];
for(int i = 0; i < produtorCount; i++) {
produtorThreads[i] = new Thread("produtor" + (i+1)) {
@Substituir
execução nula pública() {
pcd.producer();
}
};
}
Thread[] consumidorThreads = new Thread[consumerCount];
for(int j = 0; j <consumidorCount; j++) {
consumidorThreads[j] = new Thread("consumidor" + (j+1)) {
@Substituir
execução void pública() {
pcd.consumir();
}
};
}
//Iniciar o thread do consumidor produtor
for(int i = 0; i < produtorCount; i++) {
produtorThreads[i].start();
}
for(int j = 0; j <consumidorCount; j++) {
consumidorThreads[j].start();
}
}
privado estático final int DEFAULT_BUFFER_SIZE = 10;
private int bufferSize; //tamanho do buffer
private List<Objeto> bufferList;
bloqueio de bloqueio final privado = novo ReentrantLock (true);
Condição final privada condição = lock.newCondition();
public ProducerConsumerDemo(int bufferSize) {
this.bufferSize = bufferSize > 0? bufferSize: DEFAULT_BUFFER_SIZE;
bufferList = new ArrayList<Object>(bufferSize);
}
// Produção
public void produzir() {
lock.lock();
tentar {
while(bufferList.size() == bufferSize) { // O buffer está cheio
System.out.println("Espera do produtor, thread: " + Thread.currentThread().getName());
condição.await();
}
// Produção
bufferList.add(novo Objeto());
System.out.println("Produtor produz um, agora tamanho do buffer:"
+ bufferList.size() + ", e thread: " + Thread.currentThread().getName());
condição.signalAll(); // Notifica os consumidores
} catch(InterruptedException e) {
e.printStackTrace();
} finalmente {
bloquear.desbloquear();
}
}
// Consumo
public void consumir() {
lock.lock();
tentar {
while(bufferList.isEmpty()) { // O buffer está vazio
System.out.println("Espera do consumidor, thread: " + Thread.currentThread().getName());
condição.await();
}
// Consumo
bufferList.remove(0); // Remove um do topo da lista vinculada
System.out.println("Consumidor consumidor um, agora tamanho do buffer: "
+ bufferList.size() + ", e thread: " + Thread.currentThread().getName());
condição.signalAll();
} catch(InterruptedException e) {
e.printStackTrace();
} finalmente {
bloquear.desbloquear();
}
}
}