Monitor - Produtor Consumidor
Instituto Federal Goiano – Campus Morrinhos
Resumo
Uma ou mais thread de produtores criam um produto e colocam em um buffer. Uma ou mais thread de consumidores consomem o produto colocado no buffer. O produtor precisa esperar o buffer ficar livre para produzir o produto e o cliente precisa esperar o buffer ficar preenchido para consumir o produto.
Introdução
A tarefa do problema é sincronizar o acesso ao recurso, no caso a pilha, para que produtores saibam quando podem produzir e consumidores saibam quando podem consumir. Vamos então para a parte prática!
Primeiro vamos criar a classe do Consumidor:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public class Consumidor extends Thread { private int idConsumidor; private Buffer pilha; private int totalConsumir; public Consumidor(int id, Buffer p, int totalConsumir) { idConsumidor = id; pilha = p; this.totalConsumir = totalConsumir; } public void run() { for (int i = 0; i < totalConsumir; i++) { pilha.get(idConsumidor); } System.out.println("Consumidor #" + idConsumidor + " concluido!"); }
}
Essa classe é derivada da clase Thread, ou seja, cada cliente vai funcionar em um thread diferente. Os dados que utilizamos são um identificador (idConsumidor), uma referência para um Buffer e um contador (totalConsumir) que vai indicar quanto deve ser consumido pelo consumidor.
O método run() é chamado quando a thread for iniciada, ou seja, é nele que devemos definir o nosso cliente de fato. Definimos então o laço para executar as chamadas que consomem o recurso do buffer.
Vamos então definir a classe Produtor:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public class Produtor extends Thread { private int idProdutor; private Buffer pilha; private int producaoTotal; public Produtor(int id, Buffer p, int producaoTotal) {