Pregunta

Supongamos que tengo una instancia de la cola LinkedBlockingQueue;y quiero usar para cada uno con esta cola:

for(Object obj : queue)  {

//do smth
}

¿Cómo se comportará este código en caso de que la cola esté vacía en este momento?¿Bloqueará la ejecución hasta que la cola no esté vacía o no?

¡Gracias!

¿Fue útil?

Solución

no bloquea, simplemente no ingresa en la rama de bucle.

Puede verificar fácilmente:

LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
for (Object obj : queue) {
    System.out.println("Inside the loop, is empty? " + queue.isEmpty());
}
System.out.println("Not blocking, is empty? " + queue.isEmpty());

Salida: Not blocking, is empty? true

Otros consejos

No, no bloquearía (manifestación).

Java for-cada bucle obtiene el iterator de la colección y utiliza ese iterador para recorrer la colección.De acuerdo con la documentación, el iterador de LinkedBlockingQueue<T> La colección refleja el estado de la cola en el momento en que se construye el iterador:

El iterador devuelto es un iterador "débilmente consistente" que nunca arrojará ConcurrentModificationException, y garantiza atravesar los elementos tal como existían en el momento de la construcción del iterador.

Dado que la cola está vacía en el momento en que se construye el iterador, el iterador no esperará a que haya más datos disponibles e informará que no tiene elementos adicionales.Por supuesto, si la colección deja de estar vacía después de la construcción del iterador, el iterador puede devolver algunos de los elementos recién insertados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top