PDA

View Full Version : java + thread


Fenomeno85
08-05-2006, 23:58
class Colori {
private int red;
private int blue;
private int white;
//getter
public int red(){
return this.red;
}
public int blue (){
return this.blue;
}
public int white(){
return this.white;
}
public synchronized void setColori (int r, int b, int w, String nomeThread){
this.red = r;
this.blue = b;
this.white = w;
try {
Thread.sleep(344);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(">>" + nomeThread + " " + this.blue + " "+ this.white + " " + this.red);
}
}

//thread
class CambiaColori extends Thread{
private Colori color;
private String nomeThread;
private int b, w, r;
//costruttore
public CambiaColori(Colori color, String nomeThread, int b, int w, int r){
this.color = color;
this.nomeThread = nomeThread;
this.b = b;
this.w = w;
this.r = r;
}

public void run (){
synchronized (color){
color.setColori(this.b,this.w,this.r,this.nomeThread);
}
}
}
public class Test {
public static void main(String[] args) {
Colori color = new Colori();
CambiaColori d = new CambiaColori (color,"PRIMO", 3,3,3);
CambiaColori d1 = new CambiaColori (color,"SECONDO", 93,3,3);
d.start();
d1.start();
}

}



ma il synchro si mette in attesa se richiamo un metodo sincronizizzato?no perchè ho fatto questo codice per prova e i due thread lavorano correttamente

~§~ Sempre E Solo Lei ~§~

Angus
09-05-2006, 10:56
...


ma il synchro si mette in attesa se richiamo un metodo sincronizizzato?no perchè ho fatto questo codice per prova e i due thread lavorano correttamente



Cosa intendi per 'synchro'?
Comunque il codice è un pò ridondante: è inutile sincronizzarsi su color se l'unico metodo che usi è già sincronizzato.

Fenomeno85
09-05-2006, 13:01
praticamente se due thread tentano di andare a usare un metodo sincronizzato contemporaneamente, il secondo che tenta di accedere mentre l'altro lo sta usando si mette in attesa o sbaglio?

~§~ Sempre E Solo Lei ~§~

Angus
09-05-2006, 13:08
praticamente se due thread tentano di andare a usare un metodo sincronizzato contemporaneamente, il secondo che tenta di accedere mentre l'altro lo sta usando si mette in attesa o sbaglio?

~§~ Sempre E Solo Lei ~§~

Non sbagli. Ricorda però che anche se firmi il metodo come sincronizzato, il lock avviene sempre a livello di istanza, non di metodo.

Fenomeno85
09-05-2006, 13:43
Non sbagli. Ricorda però che anche se firmi il metodo come sincronizzato, il lock avviene sempre a livello di istanza, non di metodo.

quindi tutta l'istanza della classe si blocca ok quindi anche se un altro processo cerca di andare su un altro metodo questo si mette in coda. Grazieù

~§~ Sempre E Solo Lei ~§~

Angus
09-05-2006, 13:53
quindi tutta l'istanza della classe si blocca ok quindi anche se un altro processo cerca di andare su un altro metodo questo si mette in coda. Grazieù

~§~ Sempre E Solo Lei ~§~

Un altro thread si mette in attesa su un altro metodo solo se anche questo è sincronizzato. In pratica firmare un metodo come sincronizzato significa obbligare chi lo invoca ad aquisire un lock dell'istanza della classe a cui appartiene quel metodo. Ma questo non obbliga altri thread ad aquisire il lock, quindi mettendosi eventualmente in attesa, per invocare metodi non sincronizzati su una qualsiasi istanza.
Sì lo so: spiego da cani... :mbe:

Fenomeno85
09-05-2006, 14:01
quindi:

un thread può chiamare un metodo sincronizzato solo se prende il lock
intento altri thread possono richiamare metodi non sincronizzati della classe dove il thread a preso il lock

corretto?

~§~ Sempre E Solo Lei ~§~

Marinelli
09-05-2006, 14:26
Sì Teo, dovrebbe essere corretto :)
Mi sono anche fatto un paio di prove oggi ;)

Ciao :)

Fenomeno85
09-05-2006, 15:23
Sì Teo, dovrebbe essere corretto :)
Mi sono anche fatto un paio di prove oggi ;)

Ciao :)

good :O

~§~ Sempre E Solo Lei ~§~

pisto
09-05-2006, 21:57
a meno che il metodo sincronizzato non sia anche statico, il lock viene preso sui campi statici, di classe, quindi qualuncue thread lo chiami deve aspettare che il thread che ,o ha chiamato precedente ritorni da tale metodo.

ho azzeccato tutte le subordinate :stordita: ?