2012-08-23 10 views
5

Necesito despertar o enviar a dormir un single Thread a veces, y me pregunto cuál es la mejor y más eficiente manera de hacerlo.Notificar un hilo único: notificar, notificar todos o concurrent.locks.Condition?

La primera solución es señalización combinada con wait-notify (sé cómo implementar este patrón correctamente, esa no es la pregunta).

lo leí en alguna parte que el uso de la bibliotecajava.concurrent y CountDownLatch para la señalización es más eficiente. También verifiqué concurrent.locks.Condition, pero el tema this indica que se trata simplemente de una construcción (más segura para el programador) y más generalizada, sin un beneficio en el rendimiento en comparación con notify/notifyAll. Peter Lawrey recomienda usar la biblioteca Concurrency en lugar de notify-notifyAll en el comentario this, por lo que ahora estoy confundido sobre cuál es la mejor práctica para usar.

Una pregunta relacionada: ¿cuál es mejor en cuanto a rendimiento, notify o notifyAll en mi caso (es decir, si tengo un hilo)? Sé que hay muchos hilos similares sobre esto, pero ninguno de ellos da una respuesta clara. En mi caso, funcionalmente, no importa cuál uso, pero me pregunto cuál es más rápido, entonces.

+0

Confiaba ciegamente en las sugerencias de Peter Lawrey, casi siempre. – Eugene

+0

Solo lo haría si los argumentos lógicos (pro, contra) están equilibrados o si el problema es empírico y no se puede abordar analíticamente. –

Respuesta

3

IMO no hacen mucha diferencia "en cuanto al rendimiento", ya que todos suspenden el hilo llamando al correspondiente wait por lo que es muy probable que los mecanismos subyacentes sean muy similares. ¿Y por qué el rendimiento importa tanto de todos modos? A menos que tenga un patrón de espera/señal extremadamente rápido en el que la señal viene inmediatamente después de la espera, haciendo un cambio de contexto demasiado caro y requiriendo quizás un bloqueo de giro, no hay necesidad de preocuparse por el rendimiento.

Debe implementar lo que cree que es el método más conveniente para la programación y luego comparar y ver si realmente necesita algo más de rendimiento.

+0

Iría con notify/notifyToall entonces, pero queda una pregunta: ¿para señalar un subproceso, que es más eficiente? Esto requeriría saber cómo se implementa la JVM para ellos. Sé que la diferencia es insignificante, pero preferir uno para el otro no requiere un trabajo de optimización adicional (porque o bien escribo "notificar" o "notificar todo"), por lo que me gustaría utilizar la solución "teóricamente" mejor (ya que no hay razón no hacer eso). –

+0

@Thomas Calc: ¿Con qué frecuencia espera usar estos mecanismos en su aplicación? – Tudor

+0

Depende de la entrada del usuario, para ser general. En el peor de los casos, una vez por segundo. –

0

wait-notify está perfectamente bien.

ya que solo hay un hilo en la lista de espera, no hay diferencia, semántica o rendimiento, entre notify y notifyAll.

Cuestiones relacionadas