Thread - dúvida

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:

Tente algo do tipo:

[code]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() );
    }
  }
}

}
[/code]

talvez isso possa resolver seu problema. :idea:

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().

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…)

obrigado pessoal

vcs salvaram meu algoritmo :smiley:

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