2011-11-27 144 views
17

Digamos que tengo este código muy simple:¿Cómo esperar a que termine un hilo antes de que comience otro hilo en Java/Android?

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 
} 

Sin embargo, en este código, el hilo aparentemente comienza 10 veces a la vez y no espera antes de que termine la anterior. ¿Cómo verifica si el hilo está terminado antes de permitir que el hilo comience nuevamente?

+3

¿Por qué estás comenzando un hilo si no quieres hacer nada hasta que el hilo esté completo? Sería más fácil hacer una llamada a método normal, que no volverá hasta que haya terminado. – goto10

+0

Parece duplicado: https://stackoverflow.com/questions/289434/how-to-make-a-java-thread-wait-for-another-threads-output –

Respuesta

30

Antes de responder a su pregunta, le recomiendo que consulte ExecutorServices como, por ejemplo, ThreadPoolExecutor.

Ahora para responder a su pregunta:

Si desea esperar a que el hilo anterior para terminar, antes de iniciar el siguiente, añadir thread.join() en el medio:

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 

    thread.join(); // Wait for it to finish. 
} 

Si quiere lanzar 10 hilos, déjelos hacer su trabajo, y luego continúe, join en ellos después del ciclo:

Thread[] threads = new Thread[10]; 
for(int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(this); 
    threads[i].start(); 
} 

// Wait for all of the threads to finish. 
for (Thread thread : threads) 
    thread.join(); 
+0

Esto hace que el hilo principal espere hasta que termine el hilo iniciado . Si entendí correctamente, el OP quiere que cada hilo iniciado espere hasta que termine el anterior. –

+1

Por otro lado, ¿por qué crearía 10 hilos en primer lugar si tuviera la intención de hacer 10 cosas secuencialmente? – aioobe

+0

Sí, ese es el punto de mi respuesta. –

11

Si cada hilo debe esperar a que el anterior para terminar antes de empezar, es mejor que tengas un hilo único ejecutar el método de ejecución original de 10 veces en secuencia:

Runnable r = new Runnable() { 
    public void run() { 
     for (int i = 0; i < 10; i++) { 
      OuterClass.this.run(); 
     } 
    } 
} 
new Thread(r).start(); 
2

Sólo para elaborar sobre la sugerencia de aioobe:

Antes de responder a su pregunta, le recomiendo encarecidamente que consulte los ExecutorServices como, por ejemplo, el ThreadPoolExecutor.

Hay una en particular ExecutorService que se puede utilizar para esta tarea:

ExecutorService pool = Executors.newSingleThreadExecutor(); 
for (int i=0; i<10; i++) { 
    pool.submit(this); //assuming this is a Runnable 
} 
pool.shutdown(); //no more tasks can be submitted, running tasks are not interrupted 

newSingleThreadExecutor() es similar a llamar newFixedThreadPool(1) pero asegura que el servicio no puede ser reconfigurado para utilizar más de un hilo.

Cuestiones relacionadas