Thread - dúvida

5 respostas
ricardolecheta

Olá pessoal!

em um lugar de meu algoritmo eu preciso disparar várias Threads, porém eu não posso deixar o algoritmo continuar enquanto todas as Threads não tiverem terminado…

em tenho um array de Threads e somente depois que todas tiverem terminado o algoritmo pode continuar, pois ele depende do trabalho de todas as Threds…

eu não tive sucesso em implementar isso :cry:

alguém pode me dar uma dica de como fazer ?

desde já obrigado :slight_smile:

5 Respostas

mandrade81
Tente algo do tipo:
import java.util.*;

public class TestThread {
    private static int lock = 0;
    
    public TestThread() {
        OutputThread t1 = new OutputThread("AAAAAA");
        OutputThread t2 = new OutputThread("BBBBBB");
        t1.start();
        t2.start();
        
        // parte que precisa esperar as threads
        while (lock != 0)
            ;
        // pode executar
        System.out.println("posso executar........");
    }
        
    public static void main(String argv[]) {
        TestThread test = new TestThread();
        
        
        System.out.println("acabou............");
    }
    
    class OutputThread extends Thread {

      OutputThread(String name) {
        super(name);
        lock++;
      }

      public void run() {
        try {
            int tempo = 0;

            for (int i=0; i < 5; i++) {
              System.out.println(getName());
              Random tRand = new Random();
              tempo = tRand.nextInt(5);
              // dorme durante um tempo;
              Thread.sleep(1000*(tempo));
            }
            // diz que acabou .
            lock--;
        } catch (Exception e) {
            System.out.println( e.getMessage() );
        }
      }
    }
}

talvez isso possa resolver seu problema. :idea:

louds

mandrade81, seu algoritmo pode falhar dado que ++ e – não são operações atômicas no java (podem acontecer pela metade). Outro problema é que voce espera pelas threads via busy-wait, oque consome cpu em demasia.

ricardo, oque voce provavelmente precisa é do método Thread.join:

Thread[] t = new Thread[10];
for(int i = 0; i < 10; ++i) {
    t[i] = new Thread() { public void run() { System.out.println("oi"); }};
    t[i].start();
}
for(int i = 0; i < 10; ++i)
   t[i].join();
System.out.println("tchau");

Só vale lembrar para voce tratar devidamente as exceptions lançadas por join().

mandrade81

Realmente. Estou precisando revisar programação concorrente (hehehe…)

É claro que poderia ser usado um bloco synchronized nos incrementos e decrementos. Mas o código já está um lixo (espera-ocupada e cia), para que piorar (hehehe…)

ricardolecheta

obrigado pessoal

vcs salvaram meu algoritmo :smiley:

dukejeffrie

Que pena que eu nao li isso tres horas atrás!!

Mas meu algoritmo ficou assim:

for (...) {
    if (thread[i].isAlive()) {
      thread[i].join();
    }
  }

Será que esse teste é superfluo??

[]s

Criado 20 de setembro de 2003
Ultima resposta 21 de set. de 2003
Respostas 5
Participantes 4