Duvida com Thread

7 respostas
brucsantos

Bom dia pessoal.

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?

Obrigado

7 Respostas

eliangela

Olá!

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.:

public synchronized void fazAlgo() {
        try {
              while (algumaCondicao)
                  wait(); //invoca a trava em cima do próprio objeto
        } catch (InterruptedException e) {
           
        } 
        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.

Outra possibilidade é usar Futures e Callables, veja o exemplo:
http://www.guj.com.br/posts/list/50321.java#264645

brucsantos

Pessoal fiz o seguinte segundo dicas de vc’s e exemplos de codigo:

public static void processCasesInCrm() {		
		Set<Case> cases = getDataInCrm();

		ExecutorService threadPool = Executors.newCachedThreadPool();

		for(final Case c : cases) {
			threadPool.submit(new Thread() {				
				@Override
				public void run() {	
					ConnCrm connCrm = new ConnCrm();
					connCrm.connect(USER, PASSWORD);
					
					getComplementOfCases(connCrm, c);
				}

			});

		}

		try {
			threadPool.wait();
		} catch (InterruptedException e) {		
			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:

package threads;

import java.util.Random;

public class ExemploJoin {

    public static void main(String args[]) throws InterruptedException
    {
        Thread[] threads = new Thread[10];

        //Inicialização das threads
        System.out.println("Iniciando 10 threads");
        Random rnd = new Random();
        for (int i = 0; i &lt; threads.length; i++)
        {

            Thread thread = new Thread(
                    new Runner(rnd.nextInt(10)+1),
                    "Runner " + i);
            thread.setDaemon(true);
            thread.start();
            threads[i] = thread;
        }

        System.out.println("Esperando as threads processarem");
        //Espera pelas threads
        for (Thread t : threads)
            t.join();

        System.out.println("Terminando programa");
    }

    private static class Runner implements Runnable
    {
        private int times;

        public Runner(int times) {
            this.times = times;
        }

        public void run() {
            try
            {
                for (int i = 0; i &lt; times; i++) {
                    System.out.printf("Thread %s: %d vezes.%n",
                            Thread.currentThread().getName(), i);
                    Thread.sleep(500);
                }
            } catch (InterruptedException ex) {}
            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

Bru!

Criado 3 de fevereiro de 2010
Ultima resposta 3 de fev. de 2010
Respostas 7
Participantes 4