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…
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() );
}
}
}
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().
É 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…)