Simulação do clássico problema produtor-consumidor. Este programa simula o caso mais simples - buffer único. Para simular a situação real, um atraso é adicionado ao consumir e produzir itens. Você pode simular diferentes taxas de geração e consumo modificando o atraso.
[código]
[/co/**
* problema de consumidor-produtor de buffer único.
* por xu([email protected]).
* */
classe pública ProdutorConsumidor {
Buffer de objeto estático = nulo;
objeto estático mutex = new Object();
objeto estático condConsumer = new Object();
objeto estático condProducer = new Object();
public static void main(String[] args) {
Produtor de thread = new Thread() {
execução void pública() {
//for(int i=0; i<10; i++) {
for(int i=0; ; i++) {
// produz item.
tentar {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String item = new String("item-" + i);
System.out.println("[produtor] produziu " + item);
// espera pelo buffer vazio.
sincronizado (condProducer) {
while(buffer! = nulo) {
tentar {
condProducer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//coloca o item no buffer.
sincronizado (mutex) {
buffer = item;
System.out.println("[produtor] colocou " + item + " no buffer.");
}
// notifica os consumidores.
sincronizado (condConsumer) {
condConsumer.notify();
}
}
}
};
Consumidor de thread = new Thread() {
execução void pública() {
//for(int i=0; i<10; i++) {
para( ; ; ) {
// espera o item chegar.
sincronizado (condConsumer) {
while(buffer == nulo) {
tentar {
condConsumer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//obtém o item do buffer.
String item = nulo;
sincronizado (mutex) {
item = (String)buffer;
buffer = nulo;
System.out.println(" [consumidor] obtém " + item + " do buffer.");
}
//consumir item.
tentar {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" [consumidor] consumido " + item);
// notifica os produtores.
sincronizado (condProducer) {
condProducer.notify();
}
}
}
};
consumidor.start();
produtor.start();
}
}de]