2009-09-29 5 views
6

Tengo un código de registro que debe ser ejecutado después de todos Threads s se ejecutan.la forma de ejecutar una pieza de código sólo después de que todos los temas están hecho

Thread t1 = new MyThread(); 
Thread t2 = new MyThread(); 
t1.run(); 
t2.run(); 

doLogging(); 

¿Hay alguna manera de ejecutar doLogging() sólo después de que ambos hilos se hacen con su procesamiento. Ahora que se llama al doLogging() tan pronto como se inician t1 y t2.

+2

Cabe señalar que, dado que está llamando plazo en lugar de inicio ya estás obteniendo el comportamiento deseado. –

Respuesta

19

A sólo join() todas las discusiones antes de su llamada doLogging():

t1.join(); 
t2.join(); 

// the following line will be executed when both threads are done 
doLogging(); 

Tenga en cuenta que el orden de las llamadas join() No importa si desea esperar a que todos sus hilos.

+0

Gracias. Eso funcionó :) – shafi

+0

Tenga en cuenta que si usted está usando Java 1.5 o posterior del nuevo java.util.concurrent se prefiere en la programación de rosca de bajo nivel (véase la respuesta de Gregory Mostizky). –

+0

@Jim: con Java 1.5 o posterior, ni siquiera usaría un CountDownLatch para tal cosa, sino un Executor simple. –

0

Si está ejecutando el código desde el hilo principal, tener en cuenta que hará que la interfaz de usuario para colgar hasta que ambas roscas completas. Este puede no ser el efecto deseado.

lugar, usted podría considerar una construcción en la que cada hilo se sincroniza sobre su objeto Logger y realizar llamadas recibidas dentro del constructo. Dado que no sé lo que está tratando de lograr en concreto, la otra solución es lo que sugirió Joachim, solamente colocar ese código dentro de un hilo.

6

Además de la solución join() también hay algo que se llama CountDownLatch en la biblioteca java.util.concurrent. Le permite inicializarlo en un cierto número y luego esperar hasta que se haya alcanzado el número de veces especificado.

ejemplo simple:

CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS); 
for(int i=0; i<NUMBER_OF_THREADS;i++) 
    new Thread(myCode).start(); 

latch.await(); 

El pestillo debe ser golpeado explícitamente por los subprocesos de trabajo para que esto funcione sin embargo:

latch.countDown() 
+0

+1 para java.util.concurrent. Esta nueva característica hace innecesaria la mayoría de la programación de subprocesos de bajo nivel en Java. –

Cuestiones relacionadas