Preciso reimplementar esse código abaixo usando semáforos.Como faço isso?
• Considere o código “MonitorProdutorConsumidor” implementado por meio de monitores.
• Reimplemente o mesmo problema usando semáforos.
public class Principal {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Buffer bufferCompartilhado = new Buffer();
Produtor produtor1 = new Produtor(1, bufferCompartilhado, 5);
Consumidor consumidor1 = new Consumidor(1, bufferCompartilhado, 5);
produtor1.start();
consumidor1.start();
}
}
public class Buffer {
private int conteudo;
private boolean disponivel = false;
public synchronized void set(int idProdutor, int valor) {
while (disponivel == true) {
try {
System.out.println("Produtor #" + idProdutor + " esperando...");
wait();
} catch (Exception e) {
e.printStackTrace();
}
}
conteudo = valor;
System.out.println("Produtor #" + idProdutor + " colocou " + conteudo);
disponivel = true;
notifyAll();
}
public synchronized int get(int idConsumidor) {
while (disponivel == false) {
try {
System.out.println("Consumidor #" + idConsumidor
+ " esperado...");
wait();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Consumidor #" + idConsumidor + " consumiu: "
+ conteudo);
disponivel = false;
notifyAll();
return conteudo;
}
}
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!");
}
}
public class Produtor extends Thread {
private int idProdutor;
private Buffer pilha;
private int producaoTotal;
public Produtor(int id, Buffer p, int producaoTotal) {
idProdutor = id;
pilha = p;
this.producaoTotal = producaoTotal;
}
public void run() {
for (int i = 0; i < producaoTotal; i++) {
pilha.set(idProdutor, i);
}
System.out.println("Produtor #" + idProdutor + " concluido!");
}
}