Estou com uma duvida. Estou desenvolvendo uma aplicação que eu vou ter uma lista de “Objetos”, e para acelerar o processo, eu dividi minha lista em listas só que depois de processar , eu tenho fazer outro processamento. Resumindo preciso esperar todas as threads terminarem de processar para poder continuar a aplicação e como não sei o tempo que vai demorar. Como faço pra esperar essas theads terminarem e depois continuar a aplicação?
O método Thread.activeCount(); mostra quantas Threads estão ativas. E o método isAlive(); mostra se uma determinada Thread está “viva” ainda.
Você pode ainda usar o método notify() da classe Object para notificar a Thread que vai terminar a aplicação.
Veja se algumas dessas te ajuda.
Alexandre_Saudate
O comando é "wait()". Deve ser feito num bloco sincronizado de código. Ex.:
publicsynchronizedvoidfazAlgo(){
try{
while(algumaCondicao)wait(); //invoca a trava em cima do próprio objeto}catch(InterruptedExceptione){
}notifyAll(); //Notifica as threads que estão esperando
}
No seu caso, este código deve ser aplicado em algum ponto no processamento das listas. Assim, supondo que "algumaCondicao" seja : verificar se o processamento já terminou. Para a última thread que entrar, essa condição vai ser falsa, e aí, todas elas vão estar sincronizadas ao final desse trecho de código.
[]´s
ViniGodoy
Use o método join() para fazer uma thread esperar por outra. O método join() trava, até que a thread termine de processar.
Pessoal fiz o seguinte segundo dicas de vc’s e exemplos de codigo:
publicstaticvoidprocessCasesInCrm(){Set<Case>cases=getDataInCrm();ExecutorServicethreadPool=Executors.newCachedThreadPool();for(finalCasec:cases){threadPool.submit(newThread(){@Overridepublicvoidrun(){ConnCrmconnCrm=newConnCrm();connCrm.connect(USER,PASSWORD);getComplementOfCases(connCrm,c);}});}try{threadPool.wait();}catch(InterruptedExceptione){Logger.getLogger().error("Erro ao tentar aguardar finalizar os processos");}//Processamento}
Oq vc’s acham do codigo?
Obrigado
ViniGodoy
Abaixo um exemplo do uso do join:
packagethreads;importjava.util.Random;publicclassExemploJoin{publicstaticvoidmain(Stringargs[])throwsInterruptedException{Thread[]threads=newThread[10];//Inicialização das threadsSystem.out.println("Iniciando 10 threads");Randomrnd=newRandom();for(inti=0;i<threads.length;i++){Threadthread=newThread(newRunner(rnd.nextInt(10)+1),"Runner "+i);thread.setDaemon(true);thread.start();threads[i]=thread;}System.out.println("Esperando as threads processarem");//Espera pelas threadsfor(Threadt:threads)t.join();System.out.println("Terminando programa");}privatestaticclassRunnerimplementsRunnable{privateinttimes;publicRunner(inttimes){this.times=times;}publicvoidrun(){try{for(inti=0;i<times;i++){System.out.printf("Thread %s: %d vezes.%n",Thread.currentThread().getName(),i);Thread.sleep(500);}}catch(InterruptedExceptionex){}System.out.printf("Thread %s finalizou. %n",Thread.currentThread().getName());}}}
ViniGodoy
Se você está usando um ThreadPool, aí é outra história. As threads do ThreadPool não morrem assim que terminam de processar. Além disso, você submete ao pool um Runnable, não uma thread, do jeito que você fez. Pouco adianta chamar os métodos de thread lá dentro.
Nesse caso, use mesmo os Futures e Callables, como no exemplo do link que te passei.
brucsantos
Obrigado ViniGodoy! Valeu pela ajuda.
E obrigado a todos que me ajudaram tambem!
Abraços