Newsgroup: it.comp.java
Titolo: Problema Thread

Salve ragazzi...ho un problema con i thread!
Praticamente io ho una classe che lancia N volte un'altra classe che estende 
thread!
Ora il problema è che io voglio sapere quando tutti i thread lanciati sono 
terminati...come posso fare?...è la prima volta che mi trovo di fronte 
questo problema e nn sono riuscito a trovare nulla in giro!
Grazie mille
Alessio 


Puoi usare un ThreadGroup...
Dai una occhiata..
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ThreadGroup.html
Jack

In questo caso però devo crearmi un oggetto timer che vada a controllare il 
numero di thread ancora attivi?
Premetto che devo lanciare tipo 200....300 thread!


Una idea è quella di creare un Thread di Controllo che semplicemente 
verifica l'activeCount() del gruppo e poi va in sleep che sò per 3 
secondi.Quando l'activeCount è uguale a 0 il thread di controllo finisce.
Tu puoi restare in join sul thread di controllo (o puoi pure usare il 
pattern dei "listener" sarebbe meglio).Quindi appena finisce puoi 
continuare l'esecuzione del programma principale...
Ricorda che quando usi i ThreadGroup devi usare il costruttore di Thread 
che accetta anche un istanza di ThreadGroup.

Il fatto è che i thread vengono lanciati ma nn devo aspettare la loro fine 
per andare avanti..nn avrebbe senso sennò!
il clicco sul bottone...partono N thread....quando tutti sono finiti devo 
fare delle cose nn molto importanti...però devo farle e posso farle solo 
quando terminano tutti i thread!
Sinceramente usare un'altro thread che lancia questi N thread nn mi va...sai 
spiegarmi come funzionano i "listener" dei thread?
Grazie ancora
Alessio 

@le wrote:
 > Il fatto č che i thread vengono lanciati ma nn devo aspettare la loro 
fine per andare avanti..nn avrebbe senso sennň!
 > il clicco sul bottone...partono N thread....quando tutti sono finiti 
devo fare delle cose nn molto importanti...perň devo farle e posso farle 
solo quando terminano tutti i thread!
 > Sinceramente usare un'altro thread che lancia questi N thread nn mi 
va...sai spiegarmi come funzionano i "listener" dei thread?
 >
 > Grazie ancora
 > Alessio
 >
Parlavo di usare il sistema dei listener. Cioč in termine tecnico il 
pattern dell'observer.
Praticamente č il meccanismo su cui si basa tutta la gestione degli 
eventi swing.
Semplicemente ti crei una interfaccia con un metodo del tipo
interface MyListener
{
   public void doAction();
}
nella tua classe thread di controllo fai un metodo che accetti un 
oggetto di tipo MyListener e te lo memorizzi come variabile membro della 
classe.Un prototipo puň essere setListner( MyListener listener )
Il tuo thread di controllo quando si accorge che tutti i thread sono 
finiti esegue semplicemente il codice
if ( listener != null )
{
   listener.doAction();
}
A te resta semplicemente il fatto di implementare una classe che estenda 
l'interfaccia MyListener e che intraprenda le azioni che tu reputi 
necessari al termine dei thread, crearne una istanza e passarla come 
riferimento al Thread di controllo prima di essere lanciato (magari nel 
suo costruttore...)
Se cerchi in internet comunque č pieno di documentazione su queste cose...
Jack

ok!Capito quello che devo fare ma nn come!
Proverò a cercare bene...se hai qualche link mi aiuteresti.....
Grazie ancora
Alessio 


Questo link è il primo che ho trovato (non è il massimo e sicuramente 
c'è di meglio).. però spero ti aiuti a capire un pochino almeno il 
concetto....
http://www.mokabyte.it/1999/01/observer_teoria.htm
Jack

Grazie!
Vedrň di capire bene il funzionamento!
Ciao
Alessio 

@le wrote:

Non devi controllare nulla.
Quando li lanci mettili in una collection. Ciascun thread quando finisce
si toglie dal pool. Quando la collection è vuota, vuol dire che hanno
finito tutti.
Ovviamente, la collection sincronizzata.

 Premetto che devo lanciare tipo 200....300 thread!
Se veramente - verifica - devi aspettare che tutti i thread finiscano,
prova ad usare una Barrier.
uL
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Premetto che devo lanciare tipo 200....300 thread!
Non è che sono tanti 200-300 thread attivi in una singola 
applicazione[0]?
Per darti un idea sul  mio Mac con un centinaio di processi attivi e in 
funzione ci sono, circa 400 thread.
-----
[0] questa in parte è anche una domanda. non ho mai fatto benchmarking 
serio per vedere cosa succede con un tal numero di threads. Io di solito 
ne uso molto meno tramite Executors. Ma non faccio terribilmente testo, 
avevo abbandonato Java tanto tempo fa, e solo di recente ho ricominciato 
a lavorarci. E di per me preferisco la programmazione asincrona a la 
select che quella multithread. Ma questi sono, ovviamente, gusti.
-enrico
-- 
Never argue with a logician.

Sono thread che durano al massimo 20-30 secondi...poi si chiudono da soli!
Non penso siano molti...più che occupazione RAM mi preoccupa l'utilizzo CPU! 

 Non penso siano molti...più che occupazione RAM mi preoccupa l'utilizzo CPU!
Non parlavo di CPU. Parlavo di overhead nella gestione di così tanti
threads. Comunque per quello che vuoi fare tu, la soluzione migliore è
un Executor. Creare e lanciare tutti i thread uno per uno è un costo
inutile, IMHO.
-- 
non vincono, non vinceranno, non hanno domani
la forza è nel puntello impugnato da oneste fortissime mani

Sarebbe?Nn ho mai sentito parlare di Executor!
Puoi spiegarmi mieglio sta cosa?Molto interessante.....
Grazie
Alessio 

 Puoi spiegarmi mieglio sta cosa?Molto interessante.....
<
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executor.h
tml>
<
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPool
Executor.html>
Comincia a leggere qui. Poi nel caso se qualcosa non è chiaro, ne
parliamo.


Guarderò bene...poi ti farò sapere!
Grazie ancora
Alessio