Codice: Seleziona tutto
package exSincronizzazione;
public class Mailbox {
private int valore = 0;
private boolean pieno = false;
public Mailbox() {
super();
}
public synchronized void produci(int valore) throws InterruptedException{
if(this.pieno) wait();
this.valore=valore;
this.pieno=true;
System.out.format("Produttore[%s] ha prodotto un valore \n",Thread.currentThread().getName());
notifyAll();
}
public synchronized int consuma() throws InterruptedException{
int val;
if(!this.pieno) wait();
val=this.valore;
this.pieno=false;
System.out.format("Consumatore[%s] ha consumato il valore: %d \n",Thread.currentThread().getName(),val);
notifyAll();
return val;
}
}
Codice: Seleziona tutto
package exSincronizzazione;
public class Produttore extends Thread {
private Mailbox m;
private int v;
private static int count;
public static int getCount() {
return count;
}
public Produttore(Mailbox m, int v) {
super();
this.m = m;
this.v = v;
count++;
}
public void run(){
try {
m.produci(this.v);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Codice: Seleziona tutto
package exSincronizzazione;
public class Consumatore extends Thread {
private Mailbox m;
private int numIter;
public Consumatore(Mailbox m, int numIter) {
super();
this.m = m;
this.numIter=numIter;
}
public void run(){
try {
for(int i=0;i<this.numIter;i++){
Thread.sleep(2000);
m.consuma();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Codice: Seleziona tutto
package exSincronizzazione;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
public class ProvaProdCons {
private static Scanner s;
public static void main(String[] args) throws InterruptedException, IOException {
// TODO Auto-generated method stub
Mailbox m=new Mailbox();
Random ran=new Random();
boolean exit=false;
s = new Scanner(System.in);
while(!exit){
Produttore p1=new Produttore(m,ran.nextInt(100));
Produttore p2=new Produttore(m,ran.nextInt(100));
Consumatore c1=new Consumatore(m,Produttore.getCount());
p1.start();
p2.start();
c1.start();
p1.join();
p2.join();
c1.join();
System.out.println("Uscire dal programma? Digita true o false...");
exit=s.nextBoolean();
}
System.out.println("Terminato...");
}
}
Codice: Seleziona tutto
Produttore[Thread-1] ha prodotto un valore
Consumatore[Thread-2] ha consumato il valore: 14
Produttore[Thread-0] ha prodotto un valore
Consumatore[Thread-2] ha consumato il valore: 25
Uscire dal programma? Digita true o false...
false
Produttore[Thread-3] ha prodotto un valore
Consumatore[Thread-5] ha consumato il valore: 2
Produttore[Thread-4] ha prodotto un valore
Consumatore[Thread-5] ha consumato il valore: 74