Cómo esperar el inicio de un subproceso en java

Tengo una condición de carrera litte en mi prueba de instrumentación androide actual. Lo que quiero es:

  1. T1: Inicio del subproceso T2
  2. T2: Hacer algo
  3. T1: Únete a T2

Con los pasos 1 y 3 que son eventos de ciclo en vivo de Android. Pero porque en la prueba de instrumentación todo pasa muy rápido me sale:

  1. T1: Inicio del subproceso T2
  2. T1: unirse con T2 (que resultan ser un no-op)
  3. T2: Hacer algo

Seguro que podría añadir unos cuantos duerme para obtener el comportamiento deseado, pero me pregunto si hay mejor manera de hacerlo. IE hay una manera de asegurarse de que el hilo que era sólo start () -ed realmente se inició para siempre y no está sentado en alguna cola de programación en espera de puesta en marcha.

(Chico de Andy, ¿echo de menos la cita de Ada basado multitarea)

Y para responder a la pregunta de mat:

  if (this.thread != null && this.thread.isAlive ()) { this.stop.set (true); try { this.thread.join (1000); } catch (final InterruptedException Exception) { android.util.Log.w (Actor.TAG, "Thread did not want to join.", Exception); } // try } // if 

Como dije: no-op cuando el hilo no ha comenzado todavía.

Por lo general, utilizo CountDownLatch, por ejemplo, ver esta respuesta al probar procesos asíncronos.

Si desea sincronizar el inicio de muchos hilos, también puede utilizar un CyclicBarrier .

Martin, mirando su código tengo la sensación de que no puede estar usando la clase Thread de la manera en que fue diseñado para ser utilizado. En particular, probar si el otro hilo está vivo parece un anti-patrón. En la mayoría de los escenarios prácticos puede omitir la this.thread.isAlive () de su código, y el programa seguirá funcionando.

Parece que estás tratando de hacer dos subprocesos (que deberían hacer dos cosas diferentes) ejecutar la misma pieza de código, y usas condiciones lógicas (como this.thread != null ) para decidir cuál de los dos hilos está actualmente corriendo.

Normalmente, escribiría dos clases cada una extendiendo Thread e implementando un método run() . Cada método run () realiza la lógica de un solo hilo. A continuación, iniciar el segundo hilo de la primera y llamar a join () en ese segundo hilo para esperar a que se complete.

 public class SecondThread extends Thread { public void run() { ... } } public class FirstThread extends Thread { public void run() { // Only FirstThread is running ... SecondThread st = new SecondThread(); st.start(); // Now both threads are running ... st.join(); // Wait for SecondThread to complete // Only FirstThread is running ... } } 
  • Si cualquier hilo de trabajo puede actualizar la interfaz de usuario en android?
  • Obtener las sugerencias de AutoCompleteTextView del servicio en un hilo independiente
  • ASyncTask en Executor y PriorityBlockingQueue
  • Cómo ejecutar un hilo después de completar otro hilo
  • Sincronizar el acceso a HashMap desde dos subprocesos en java
  • Android Thread.sleep a veces espera demasiado tiempo
  • Android: ¿Posible que el hilo de fondo bloquee hasta que el hilo de UI finalice la operación?
  • CancelaciónExcepción al utilizar ExecutorService
  • Manera eficiente de manipular los subprocesos RxJava
  • Android AsyncTask.THREAD_POOL_EXECUTOR vs ThreadPool personalizado con Runnables
  • Cómo pausar / reanudar el hilo en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.