PDA

View Full Version : [JAVA] aspettare che più thread finiscano


lemming
16-10-2007, 08:32
Come si fa a aspettare che una serie imprecisata di thread siano terminati.
Per aspettare che un thread th sia finito, faccio un thread (joinThread) e in run gli metto th.join
Se i thread sono più di uno e sono stati istanzati così:

Thread th[];

for(int i=0; i<100; i++)
{th[i] =new Thread();
th[i].start();}

Thread joinThread = new Thread();
???

Il problema è perchè quando istanzo il joinThread non è detto che tutti i Thread th siano stati finiti. Però dovrebbero essere stati istanziati tutti.
Quindi avrei pensato di fare qualcosa tipo

il run di joinThread -->

run(){
for(int q =0; q >=th.length; q++)
{ try {th[q].join(); }
catch...}
altraFunzione();
}
altraFunzione dovrebbe essere eseguita quando tutti i th sono finiti.
Dov' è il problema?
altraFunzione mi viene eseguita prima che tutti i thread concludano la loro vita.

mad_hhatter
16-10-2007, 08:41
Come si fa a aspettare che una serie imprecisata di thread siano terminati.
Per aspettare che un thread th sia finito, faccio un thread (joinThread) e in run gli metto th.join
Se i thread sono più di uno e sono stati istanzati così:

Thread th[];

for(int i=0; i<100; i++)
{th[i] =new Thread();
th[i].start();}

Thread joinThread = new Thread();
???

Il problema è perchè quando istanzo il joinThread non è detto che tutti i Thread th siano stati finiti. Però dovrebbero essere stati istanziati tutti.
Quindi avrei pensato di fare qualcosa tipo

il run di joinThread -->

run(){
for(int q =0; q >=th.length; q++)
{ try {th[q].join(); }
catch...}
altraFunzione();
}
altraFunzione dovrebbe essere eseguita quando tutti i th sono finiti.
Dov' è il problema?
altraFunzione mi viene eseguita prima che tutti i thread concludano la loro vita.

quel for ha qualcosa che non mi torna

lemming
16-10-2007, 08:45
Cosa th.length ? Ho sbagliato a copiare nel post, scusa, era q>th.length

mad_hhatter
16-10-2007, 08:48
Cosa th.length ? Ho sbagliato a copiare nel post, scusa, era q>th.length

peggio ancora :D il blocco del for non lo esegui neanche una volta e così passi subito oltre. devi mettere < non >

^TiGeRShArK^
16-10-2007, 09:02
cmq per il problema principale mi sa che basta una barriera.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

lemming
16-10-2007, 09:38
Interessante la cosa della CyclicBarrier, ma come funziona, non ho capito molto?

Per mad_hhater: Ecco cosa succede a riutilizzare il codice (copia-incolla) :)

^TiGeRShArK^
16-10-2007, 09:57
L'esempio che c'è in cima al javadoc mi pare piuttosto auto-esplicativo :p
cmq il punto importante è la chiamata a barrier.await() che mette il singolo thread in attesa che gli altri finiscano.

lemming
16-10-2007, 10:41
Grazie