Main:
Classe Monitor:
Classe Produttore
Classe Consumatore:
Codice:
public class Main {
public static void main (String args[])
{ Monitor m = new Monitor();
new Produttore(m);
new Consumatore(m);
}
}
Codice:
class Monitor {
private int unDato;
private int sem;
public Monitor() {
sem=0;
}
public synchronized int prendi()
{
if (sem!=1)
try
{
wait();
}
catch (Exception e){}
/* se viene eseguito questo codice, significa che il semaforo è a 1
* cioè il buffer è pieno */
System.out.println("Preso: " + unDato);
sem=0; // il buffer, all'uscita da questo metodo, deve
// risultare vuoto, in quanto il suo valore è stato
// consumato.
notifyAll(); // sveglia produttore
return unDato;
}
public synchronized void metti(int d)
{ if (sem!=0)
try
{
wait();
}
catch (Exception e){}
/* se viene eseguito questo codice, significa che il semaforo è a 0
* cioè il buffer è vuoto */
unDato = d;
System.out.println("Depositato: " + unDato);
sem=1; // segnala che il buffer è pieno
notifyAll(); // sveglio consumatore
}
}
Codice:
class Produttore implements Runnable
{ Monitor v;
Produttore(Monitor m)
{ v = m;
new Thread(this, "Produttore").start();
}
public void run()
{ // produce 10 numeri interi qualunque in sequenza
for(int i = 45; i < 55; i++)
{ v.metti(i);
try
{ Thread.sleep(500);
}
catch (Exception e) { }
}
}
}
Codice:
class Consumatore implements Runnable
{ Monitor v;
Consumatore(Monitor m)
{ v =m;
new Thread(this, "Consumatore").start();
}
public void run()
{ for(int i = 0; i < 10; i++)
{
System.out.println( v.prendi());
try
{
Thread.sleep(1000);
}
catch (Exception e)
{ }
}
}
}