2012-08-06 16 views
5

Por lo que sé, tanto la lista como la matriz pueden crecer sin límites o ¿estoy equivocado? Pero cuando he pasado por el documentation in the Executor Service Veo esto:¿Por qué ArrayBlockingQueue se llama una cola limitada mientras que LinkedBlockingQueue se llama cola de bloqueo ilimitada?

Colas ilimitadas. El uso de una cola ilimitada (por ejemplo, LinkedBlockingQueue sin una capacidad predefinida) provocará que nuevas tareas esperen en la cola cuando todos los hilos de la base de datos están ocupados. Por lo tanto, nunca más se crearán subprocesos corePoolSize. (Y el valor de la maximumPoolSize por lo tanto no tiene ningún efecto.)

lo mismo ocurre con los cambios en las propiedades Unbounded Queue cuando el LinkedBlockingQueue tiene una capacidad definida?

Y este escrito para ArrayBlockingQueue:

colas acotada. Una cola acotada (por ejemplo, un ArrayBlockingQueue) ayuda a evitar el agotamiento de recursos cuando se utiliza con el valor máximo de PoolSizes, pero puede ser más difícil de ajustar y controlar. Los tamaños y tamaños de agrupación máximos de Queue pueden intercambiarse entre sí: el uso de grandes colas y grupos pequeños minimiza el uso de CPU, los recursos del sistema operativo y carga de cambio de contexto, pero puede generar un rendimiento artificialmente bajo. Si las tareas se bloquean con frecuencia (por ejemplo, si están vinculadas con la E/S ), un sistema puede programar el horario para más hilos que que de otro modo permitiría. El uso de colas pequeñas generalmente requiere tamaños de grupo de más grandes, lo que mantiene las CPU ocupadas pero puede encontrar una sobrecarga de programación inaceptable, que también disminuye el rendimiento.

Respuesta

7

¿Por qué crees que un ArrayBlockingQueue puede crecer sin límites? Desde su own documentation:

Este es un clásico "buffer delimitado", en el que una matriz de tamaño fijo contiene elementos insertados por productores y extraídos por los consumidores. Una vez creada, la capacidad no puede aumentarse. Los intentos de poner un elemento en una cola completa darán como resultado el bloqueo de la operación; los intentos de tomar un elemento de una cola vacía se bloquearán de manera similar.

En otras palabras, una vez que se llena, está llena, no crece.

¿Te confunden con un ArrayList por casualidad, que también está respaldado por una matriz, pero que lo amplía cuando es necesario?

¿La propiedad Colas ilimitadas cambia cuando LinkedBlockingQueue tiene una capacidad definida?

Sí, de ahí por qué se describe como "opcionalmente limitado" en su Javadocs. Además, los documentos indican que (énfasis mío):

El argumento del constructor de límite de capacidad opcional sirve para evitar la expansión excesiva de la cola. La capacidad, si no se especifica, es igual a Integer.MAX_VALUE.Los nodos vinculados se crean dinámicamente en cada inserción a menos que esto ponga la cola por encima de la capacidad.

+0

@Andrej Sí, estoy confundiendo ArrayList for Array. gracias por la aclaración. Por cierto, ¿cómo crece ArrayList cuando está respaldado por una matriz subyacente que no puede crecer? – Geek

+4

Cuando se necesita cambiar el tamaño, 'ArrayList' asigna una nueva matriz más grande y copia todos los elementos a esa nueva matriz. –

2

Por lo que yo sé tanto de la lista enlazada y la matriz pueden crecer sin límites o estoy equivocado

Una lista enlazada como un tamaño ilimitado. Una matriz tiene tamaño fijo. Una ArrayList envuelve una matriz y la reemplaza cuando necesita una más grande.

Lo mismo ocurre con los cambios no acotadas propiedad de cola cuando el LinkedBlockingQueue tiene una capacidad definida

Cuando LinkedBlockingQueue tiene una capacidad máxima, es limitada, pero no se utiliza de esta manera de forma predeterminada.

+1

"Una ArrayList envuelve una matriz y la reemplaza cuando necesita una más grande". Puede ver esto en el método ensureCapacity para ArrayList. –

3

Desde el documentataion para ArrayBlockingQueue

Un acotada bloqueo cola respaldado por una matriz. Esta cola ordena elementos FIFO (primero en entrar, primero en salir). El jefe de la cola es el elemento que ha estado en la cola más tiempo. La cola de la cola es el elemento que ha estado en la cola el tiempo más corto. Los nuevos elementos se insertan en la cola de la cola y las operaciones de recuperación de la cola obtienen elementos al principio de la cola.

Si observa que todos los constructores de ArrayBlockingQueue toman una capacidad porque esta clase se diseñó para ser acotada. Esta elección se realizó porque si desea una cola simultánea, probablemente no desee la sobrecarga que viene con el cambio de tamaño de una ArrayList. Por lo tanto, si desea una cola ilimitada LinkedBlockingQueue es una mejor opción, ya que no implica esta sobrecarga.

2

El javadoc for LinkedBlockingQueue dice:

Una cola de bloqueo delimitada opcionalmente basado en nodos enlazados [...]

La capacidad opcional argumento del constructor ligado sirve como una manera de prevenir la expansión cola excesiva. . La capacidad, si no se especifica, es igual a Integer.MAX_VALUE.

El javadoc of ArrayBlockingQueue dice:

Un acotada bloqueo cola respaldado por una serie [...]

Este es un clásico "acotada buffer", en el que una matriz de tamaño fijo. contiene elementos insertados por los productores y extraídos por los consumidores. Una vez creado , la capacidad no se puede aumentar

Así, una cola de bloqueo unido puede estar delimitado ou sin límites, mientras que un ArrayBlockingQueue siempre está acotado.

0

otra respuesta es muy correcta! Proporciono otra manera de explicar. bueno, también me confunde el término "pasado sin límite". puedes mirar el código fuente sopló.

/** The queued items */ 
final Object[] items; 

/** items index for next take, poll, peek or remove */ 
int takeIndex; 

/** items index for next put, offer, or add */ 
int putIndex; 

/** Number of elements in the queue */ 
int count; 

a partir del código fuente, podemos ver la matriz es última, por lo que no se puede cambiar el tamaño de la matriz. si usamos LinkedBlockingQueue, siempre podemos agregar más elementos ... y en el código fuente, la siguiente referencia no es definitiva. NOTA, en teoría, LinkedBlockingQueue no es ilimitado. porque solo puede almacenar MAX_INTEGER menos 8 elementos. de javadoc, la cola ilimitada es PriorityBlockingQueue. pero PriorityBlockingQueue también solo puede almacenar MAX_INTEGER -8 elementos. entonces creo que no hay una cola sin límites perfecta ...

Cuestiones relacionadas