
Originariamente inviata da
andbin
...
Grazie mille, ho risolto!
Avrei però un altri due dubbi: in pratica vorrei passare ai miei thread il nome (e lo faccio tramite .currentThread().getThread() ) ma da errore in compilazione (avevo visto questo esempio da codici del prof) e non riesco a capire se devo usarlo all'interno della classe che istanzia la variabile globale o all'interno dell'implementazione di runnable. Inoltre volevo sapere la differenza tra un metodo synchronized e no e se è necessario usarlo all'interno dei metodi di varGlobale. Vi allego il codice per semplicità
codice:
public class produttori { public static void main(String args[]){
varGlobale x = new varGlobale();
Thread product1 = new Thread(new products("PRODUTTORE1",x));
Thread product2 = new Thread(new products("PRODUTTORE2",x));
product1.start();
product2.start();
try{
product1.join();
// System.out.println(">> Join di procut 1...");
product2.join();
// System.out.println(">> Join di product 2...");
}catch (InterruptedException e) {e.printStackTrace();}
}
}
class varGlobale {
int acc = 0;
public varGlobale () {
String threadName = Thread.currentThread().getName();
System.out.println(">>" + threadName + " instanzio la variabile globale..");
}
public int getVar () { return acc; }
public int sommaVar(int i){
acc+=i;
return acc;
}
}
class products implements Runnable {
String threadName = Thread.currentThread().getName();
varGlobale x;
public products (String threadName,varGlobale x) {
super(threadName);
this.x=x;
System.out.println("Costruttore di : "+ threadName + "istanzio acc");
}
public void run(){
boolean ciclo = true;
while(ciclo){
int rand = (int) (Math.random() * 21) - 10;
System.out.println(">> Sono il thread: "+ threadName +" numero random generato " + rand );
if(rand == 0) {
System.out.println(">> Rand vale 0, esco!");
ciclo = false;
}
else {
x.sommaVar(rand);
System.out.println("Valore di acc attuale: " + x.getVar());
}
}
}
}