ejemplo java concurrency queue blockingqueue

ejemplo - Java BlockingQueue take() vs poll()



blockingqueue java 8 (2)

El bloqueo es probablemente más eficiente. En segundo plano, el subproceso que inicialmente llama a take() pone en suspensión si no hay ningún elemento disponible, lo que permite que otros subprocesos hagan lo que sea necesario. Los métodos que agregan elementos a la Cola se activarán en espera de los hilos cuando se agrega un elemento, por lo que se dedica un tiempo mínimo a revisar la cola una y otra vez para ver si un elemento está disponible.

Al consumir valores de una cola en un bucle infinito, ¿qué sería más eficiente?

1) Bloqueo en la cola hasta que un valor esté disponible a través de take ()

while (value = queue.take()) { doSomething(value); }

2) Dormir durante n milisegundos y verificar si un artículo está disponible

while (true) { if ((value = queue.poll()) != null) { doSomething(value); } Thread.sleep(1000); }


Ten cuidado cuando usas take() . Si está utilizando take() de un servicio y el servicio tiene conexión de base de datos.

Si se devuelve take() después del período de tiempo de espera de conexión obsoleta, se lanzará la excepción de conexión obsoleta.

Utilice el sondeo para el tiempo de espera predefinido y agregue una comprobación nula para el objeto devuelto.