Uso CountDownLatch para esperar un determinado evento de otro componente (que se ejecuta en un hilo diferente). El siguiente enfoque cabría la semántica de mi software, pero no estoy seguro de si funciona como espero:Llamadas múltiples a CountDownLatch.await (int) con tiempo de espera
mCountDownLatch.await(3000, TimeUnit.MILLISECONDS)
otherComponent.aStaticVolatileVariable = true;
mCountDownLatch.await(3500, TimeUnit.MILLISECONDS);
... <proceed with other stuff>
El escenario debe ser el siguiente: espero a 3 segundos, y si la retención es Sin contar a 0, notifico al otro componente con esa variable y luego espero 3.5 segundos como máximo. Si hay tiempo de espera de nuevo, entonces no me importa y procederé con otras operaciones.
Nota: Sé que no se ve así, pero el escenario anterior es totalmente razonable y válido en mi software.
He leído la documentación de await (int, TimeUnit) y CountDownLatch, pero no soy un experto en Java/Android, por lo que necesito una confirmación. Para mí, todos los escenarios se ven válida:
- Si el primer Await tiene éxito, entonces el otro se esperan volver inmediatamente
- Si los primeros tiempos aguardan fuera, entonces el otro lo esperan sigue siendo válida; lo tanto, si el otro hilo se da cuenta de la señal estática, la segunda aguardan puede devolver correctamente
- Ambos esperan tiempo de espera de llamadas (esto está muy bien de acuerdo a la semántica de mi software)
estoy usando lo esperan (.. .) correctamente? ¿Puede un segundo esperar (...) ser utilizado de la manera anterior incluso si se agotó el tiempo esperado (...) en el mismo objeto?
Gracias por el código muy completo. En realidad, mi pregunta fue mucho más simple que esto, pero si estoy en lo cierto, realmente * demuestras * que mis suposiciones son correctas, ¡así que muchas gracias por eso! Mi pregunta principal era solo esta: si el primero espera (** ** agota **) un objeto, ¿puedo volver a llamar a await() en el mismo objeto (como en mi código)? Supongo que sí, pero como dije, no soy un experto en Java. (Después de recibir la confirmación final, ciertamente marcaré su respuesta como respuesta, porque es más de lo que necesitaba). –
Heh, para ser sincero, no estaba 100% seguro de la respuesta de la parte superior de mi cabeza, y la mejor manera de encontrar una respuesta como esa es intentarlo. De ahí la prueba :) –