[RESOLVIDO] Threads , Saber quando threads finalizam

3 respostas
samuelrrm

Olá,

estou com uma duvida, preciso saber quando todas as threads que lanço chegam ao seu fim.

public void enviaMensagem() throws Exception {
        int ntarefas = this.destino.length;
        int nthreads = 5;
        int aux = 0;
        ntarefas = ( (ntarefas/nthreads) + (ntarefas%nthreads) );

        while( nthreads > 0 ){
            String[] saida = java.util.Arrays.copyOfRange(this.destino, aux, (ntarefas+aux));
            TrataTexto tt = new TrataTexto (saida,Integer.toString(nthreads));
            tt.start();
            aux += ntarefas;
            nthreads--;
        }
    }

a thread tt ai é composta assim TrataTexto (String[] saida,String name).

o que quero realmente é emitir uma saida se todas e somente se todas as threads aí lançadas cheguem ao seu fim.

Sou novo no GUJ e se o topico estiver no lugar errado por favor movam.

[]'s

3 Respostas

ViniGodoy

Quem dispara essas threads pode dar um join() em todas elas. Esse join() fará o Java esperar até que a thread tenha terminado.

public void  enviaMensagem() throws Exception {  
   int ntarefas = this.destino.length;  
   int nthreads = 5;  
   int aux = 0;  
   ntarefas = ( (ntarefas/nthreads) + (ntarefas%nthreads) );  
   TrataTexto tts[] = new TrataText[nThreads];

   for (int i = 0; i < nThreads; i++) {
      String[] saida = java.util.Arrays.copyOfRange(this.destino, aux, (ntarefas+aux));  
      TrataTexto tt = new TrataTexto (saida,Integer.toString(nthreads));  
      tt.start();  
      tts[i] = tt;
      aux += ntarefas;  
   }  

   //Espera as threads terminarem
   for (TrataText tt : tts) {
      tt.join();
   }
   exibirResultados();
}
CarvalR2

Será que isso ajuda?

List threadsFinalizadas = new ArrayList();

public void enviaMensagem() throws Exception {

int ntarefas = this.destino.length;

int nthreads = 5;

int aux = 0;

ntarefas = ( (ntarefas/nthreads) + (ntarefas%nthreads) );
while( threadsFinalizadas.size() != nthreads){   
    String[] saida = java.util.Arrays.copyOfRange(this.destino, aux, (ntarefas+aux));   
    TrataTexto tt = new TrataTexto (threadsFinalizadas, saida,Integer.toString(nthreads));   
    tt.start();   
    aux += ntarefas;   
    nthreads--;   
}

}

TrataTexto adiciona um item na lista, na última linha do método run()

Talvez também ThreadGroup.activeCount() possa ajudar, mas no javadoc cita a palavra “estimativa”.

samuelrrm

ViniGodoy ,

Obrigado, Funcionou não como queria mas já sei o que fazer.Só vou precisar dar um repaint num JProgresBar.

CarvalR2,
Obrigado ,também.
Só pra constar, a comparação do while iria terminar-lo no meio do caminho.Iria criar também menos threads.
Ficariam coisas a fazer.

Soluçoes simples que eu nem imaginava. :lol:
Obs. Voces 7 segundos de diferença nas respostas de vocês aqui. :shock:

[]'s

Criado 9 de junho de 2010
Ultima resposta 9 de jun. de 2010
Respostas 3
Participantes 3