Newsgroup: it.comp.java
Titolo: TimerTask e sincronizzazione Thread

Salve a tutti...
Ho una questione a cui non riesco a venire a capo : ho due task che si
attivano ognuno all'apertura di un tab di un jtabbedPanel swing. Essi
fanno riferimento a parti (funzioni) diverse della stessa risorsa,
cioè un programma esterno che dialoga via TCP/IP con il mio programma.
il problema è il seguente : non riesco a fermare un task mentre faccio
partire (o ripartire) l'altro...continuano comunque a richiedere la
risorsa e a sporcare in questa maniera l'output vistosamente...che
metodi si usano in java per questo? La classe Thread non permette (mi
pare) di distruggere processi...ho provato la classe TimerTask e
funziona bene, ma quando  provo a distruggere il timer e il timertask
ad esso appartenente questi continuano comunque a fare il loro
lavoro....colpa mia immagino, e della mia scarsa programmazione...non
di Java o di Windows Xp....
Qualcuno di voi conosce qualche buon metodo funzionante? Gli sarei
veramente grato...

 veramente grato...
in POSIX userei un semaforo. In Java non credo esistano, pero' puoi
fare con una variabile condivisa.
In pratica quando una delle due thread vuole accedere alla risorsa
controlla la variabile, se e' 1 allora aspetta, se e' 0 allora setta la
variabile a 1 e accede alla risorsa.
altrimenti (direi che questa e' la soluzione migliore) usi un metodo
statico per accedere alla risorsa e lo dichiari (il metodo)
syncronized.
Ciao Jack

Utilizza un semaforo ...
Puoi fare (se non hai troppi problemi ) una classe  semaforo  con un
metodo
sincronizzato che controlla l'accesso alla variabile del semaforo.. 
   se libero ti restiuisce true elo occupa 
   se è occupato false...e magari ti metti in attesa 
Potresti poi fare una lista di quelli che aspettano il rilascio 
del semaforo...
praticamente quando la risorsa è rilasciata ...prima di liberare 
il semaforo si controlal se nella lista c'è qualcuno che aspetta.. 
  se c'è si risveglia il processo ...
  altrimenti siliera il semaforo...
Sono stato un po' sintetico ma spero di averti dato l'idea di fondo...
CIao
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie per i suggerimenti...ho capito cosa intendete, ma quello che non
mi è chiaro è :
Come posso, con che metodi e classi di Java, attivare/disattivare un
thread (o un timertask) per far sì che esso possa accedere alla
risorsa? ad esempio il metodo Thread.destroy()
non ha alcun effetto sui miei thread....
Una domanda a parte : un metodo synchronized permette realmente ad un
solo processo alla volta di accedere alla sua esecuzione? Tipo regioni
critiche e strutture di questo tipo?
Grazie a tutti.

 risorsa? ad esempio il metodo Thread.destroy()
per esempio quando trovi la risorsa occupata 
   Thread.currentThread().wait() 
che blocca il processo
Invece potresti mettere i tread in una lista e utilizzare la .notify() 
sul tread in pausa.... che riattiva il processo 
... dovrebbe funzionare....
I metodi syncronize sono utilizzati solo da uno alla volta ....
Credo che se lavori su questi metodi dovresti arrivare a ciň che vuoi..
poi in rete di
implementazioni di semafori in java ce ne dovrebbero essere diversi....


Ho trovato questo ..molto più chiario di me....
http://www.mokabyte.it/1998/05/threads2.htm


Grazie per i suggerimenti : ho inserito una variabile "semaforo"
mutuamente esclusiva tra i due thread, ma essi sembrano comportarsi in
maniera molto strana....praticamente una volta avviati continuano
comunque a girare  : non riesco a capire come mai...veramente molto
strano...secondo voi ogni volta che il processore viene assegnato ad un
thread esso esegue il suo metodo RUN interamente? Oppure l'esecuzione
può essere bloccata/ripresa anche a metà di esso?

Non sono uno esperto di thread ... ma direi che la cosa migliore è 
che metti dei log e vedi i giri che fa....ti chiarisci molto le idee.
Poi considera che il multithread  sicuramente è di tipo time sharing
quindi
delle volte è attivo un thread e delle volte è attivo un'altro...Per
esempio
fai contare fino a 10000 i due thread e fa  una System.output..e vedi
 come si susseguono i due thread ...
