PDA

View Full Version : Java - Problema sincronizzazione


Fenomeno85
19-04-2006, 19:53
Allora non capisco perchè non viene visualizzato prima tutto uno e poi l'altro ... invece i messaggi sono mischiati come se non sincronizzassi nulla.
Dove sbaglio?


/* questa classe serve a testare il multithreading. E' sincronizzata*/
public class TestThreadSincro implements Runnable{
/* variabile utilizzata per identificare il thread */
final int pidThread;

/* il costruttore richiede il numero del thread*/
TestThreadSincro (int pid){
this.pidThread=pid;
}

/* restituisce il pid */
public int getPidThread(){
return this.pidThread;
}
/* questo metodo è l'implementazione necessaria per i thread */
synchronized public void run (){
for (int i=0;i<13;i++)
System.out.println("Sono il processo" + this.getPidThread() );
}
}


mentre questo è il codice del main


Thread t1 = new Thread (new TestThreadSincro(1));
Thread t2 = new Thread (new TestThreadSincro(2));
t1.start();
t2.start();

~§~ Sempre E Solo Lei ~§~

franksisca
19-04-2006, 20:15
non vorrei sbagliare, ma la prima cosa che mi viene in mente è:public synchonized

pisto
19-04-2006, 20:22
non ho capito bene, vuoi che un tread prima finisca il metodo run() e poi parta l'altro?
se è così non succede perché non c'è niente che fermi l'esecuzione del thread che crea i due thread figli, dovresti usare join()

nightwolf
19-04-2006, 21:05
Ma facendo cosi tu crei due oggetti della classe TestThreadSincro che sono distinti quindi hai due monitor distinti (non uno solo) ognuno associato a un oggetto diverso..quindi di fatto i due thread acquisiscono il lock su metodi run di oggetti distinti e quindi non si escludono mutuamente..mia personale interpretazione :D

pisto
19-04-2006, 21:08
penso che alla fine sincronizzare il run non serva a niente, o metti un join() o un oggetto esterno su cui sincronizzarti. il metodo più pulito secondo me è il primo (non mi sono mai piaciuti gli oggetti su cui sintonizzarsi)

Fenomeno85
19-04-2006, 21:11
Ma facendo cosi tu crei due oggetti della classe TestThreadSincro che sono distinti quindi hai due monitor distinti (non uno solo) ognuno associato a un oggetto diverso..quindi di fatto i due thread acquisiscono il lock su metodi run di oggetti distinti e quindi non si escludono mutuamente..mia personale interpretazione :D

te ghe rasun ... va buo direi che per stasera finisco qui con java che ho appena finito di testare anche una applicazione client/server in multithreading.
Quindi per fare quella applicazione dovrei leggermente complicarlo va bhe vedrò domani mattina.

~§~ Sempre E Solo Lei ~§~

Fenomeno85
19-04-2006, 21:13
penso che alla fine sincronizzare il run non serva a niente, o metti un join() o un oggetto esterno su cui sincronizzarti. il metodo più pulito secondo me è il primo (non mi sono mai piaciuti gli oggetti su cui sintonizzarsi)

vedrò anche questa versione. Domani mattina se mi connetto dal poli e ho finito o son in alto mare posto una versione.
Hai per caso il link diretto a docs per java 1.5?? non ho voglia di cercare

~§~ Sempre E Solo Lei ~§~

pisto
19-04-2006, 21:18
scaricala qui
http://java.sun.com/j2se/1.5.0/download.jsp#docs

Fenomeno85
19-04-2006, 21:21
scaricala qui
http://java.sun.com/j2se/1.5.0/download.jsp#docs

grazie mille

~§~ Sempre E Solo Lei ~§~