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:
- T1: Inicio del subproceso T2
- T2: Hacer algo
- 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:
- Android: "Actualizar automáticamente" después de un tiempo determinado
- Obtener referencia a Thread Object desde su ID
- Cómo configurar la imagen de Url usando AsyncTask?
- Llamada desde una excepción de hilo incorrecto
- ¿Cómo puede el puerto AsyncTask de Android a Java?
- T1: Inicio del subproceso T2
- T1: unirse con T2 (que resultan ser un no-op)
- 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.
- Espere un hilo antes de continuar en Android
- Lo que se mata con el hilo de la interfaz de usuario de Android
- Cómo suspender y reanudar los hilos en android?
- ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
- ¿Un Runnable puede devolver un valor?
- Respuesta de respuesta de Okhttp en el hilo principal
- ¿Una clase anónima mantiene referencias externas vivas?
- ¿Cuándo necesitamos usar runOnUiThread en la aplicación android?
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 ... } }
- Android: ¿Presentar una notificación durante una llamada?
- ListView OnItemClickListener con una nueva actividad