Newsgroup: it.comp.java
Titolo: thread e synchronized

Scusate, domanda forse banale,
ma come faccio a sapere durante l'esecuzuione di 
un programma che lancia 3 thread che accedono ad un metodo 
synchronized quali sono quelli in attesa?
quello che volgio ottenere e' un output del tipo
[thread-1] sono in esecuzione....
[thread-1] sono in esecuzione....
[thread-2] sono in attesa....
[thread-3] sono in attesa....
[thread-1] ho finito....
[thread-2] sono in esecuzione....
[thread-3] sono in attesa....
etc etc.
Grazie mille


Dalla console di Tomcat, premendo Ctrl+Interr ottengo:
_______________________________________________________________________
Full thread dump Java HotSpot(TM) Client VM (1.5.0-b64 mixed mode):
"TP-Monitor" daemon prio=5 tid=0x0b0174a0 nid=0x624 in Object.wait() 
[0x0bb3f000
..0x0bb3f9e4]
         at java.lang.Object.wait(Native Method)
         - waiting on <0x03564278> (a 
org.apache.tomcat.util.threads.ThreadPool$M
onitorRunnable)
         at 
org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable.run(ThreadP
ool.java:559)
         - locked <0x03564278> (a 
org.apache.tomcat.util.threads.ThreadPool$Monit
orRunnable)
         at java.lang.Thread.run(Unknown Source)
"TP-Processor4" daemon prio=5 tid=0x0af89638 nid=0x614 runnable 
[0x0baff000..0x0
baffa64]
_______________________________________________________________________
Fai caso a "waiting on <0x03564278>"
--
Marco

per sapere il thead corrente puoi usare Thread.CurrentThread()
se lo usi nel synchronized sai quale thread è nel syncronized: gli
altri stanno aspettando.

 altri stanno aspettando.
Faccio cosi:
public void run() {
        System.out.println(Thread.currentThread().getName() + " Sono entrato");
        querySimulation();
        System.out.println(Thread.currentThread().getName() + " Ho finito");
    }
 
    public static synchronized void querySimulation() {
        System.out.println("Sto eseguendo " + Thread.currentThread().getName());
 
	// eseguo il codice
    }
ottengo:
cliente Pippo Sono entrato
Sto eseguendo cliente Pippo
cliente Pluto Sono entrato
cliente Pippo Ho finito
Sto eseguendo cliente Pluto
cliente Pluto Ho finito
Logicamente il mio scopo non e' quello di scrivere l'output ma eseguire
determinati metodia  seconda dello status e della posizioni di alcuni
thread.
Non trovo soluzioni migliori :(

ti memorizzi i tre thread da qualche parte (es in variabili di classe
t1, t2 t3)
quindi invece di fare la stampa fai qualcosa del tipo
if (Thread.currentThread()==t1)   // fai qualcosa
else if(Thread.currentThread()==t2) // fai altro
se non sbaglio ci dovrebbe anche essere un metodo isActive() nella
classe thread,
quindi puoi anche fare un test del tipo: t1.isActive()...
Spero di averti aiutato!

 Spero di averti aiutato!
Si grazie,
per funzionare funziona e, anche se non mi sembra molto "elegante", il
risultato e' quello che volevo :)
ciao,
cristain.


Se puoi/vuoi provare darei un'occhiata a java.lang.management del jdk 
1.5, personalmente non ho ancora avuto l'occasione di utilizzarlo.
Sarei interessato ad eventuali tue esperienze.
Non so se soddisfa il tuo senso estetico pero' :)
--
Marco

 Non so se soddisfa il tuo senso estetico pero' :)
:) 
Ciao,
cristian.