La forma de ejecutar una pieza de código sólo después de que todas las discusiones se llevan a cabo

StackOverflow https://stackoverflow.com/questions/1492069

  •  18-09-2019
  •  | 
  •  

Pregunta

Tengo un código de registro que debe ser ejecutado después de todos Threadss se ejecutan.

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 doLogging() se llama tan pronto como se ponen en marcha t1 y t2.

¿Fue útil?

Solución

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.

Otros consejos

Además de la solución join () también hay algo que se llama CountDownLatch en la biblioteca java.util.concurrent. Se le permite inicializar a un número determinado y luego esperar hasta que fue alcanzado el número especificado de veces.

Un simple ejemplo:

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

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. Esto puede no ser el efecto deseado.

En su lugar, se 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 Joachim sugirió, solamente la colocación de ese código dentro de un hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top