2011-07-06 9 views
5

Así que estoy usando un BlockingQueue [ArrayBlockingQueue] de tamaño fijo en una aplicación tipo productor/consumidor, pero quiero que el usuario pueda cambiar el tamaño de la cola sobre la marcha. El problema es que no hay una implementación de BlockingQueue que permita cambiar la capacidad después de la creación. ¿Alguien se ha encontrado con esto antes? ¿Algunas ideas?Re-dimensionable Java BlockingQueue

Respuesta

1

Puede ampliar LinkedBlockingQueue. Su límite es un límite suave (es decir, solo un cheque adicional) y puede hacer que esto sea algo que puede cambiar (deshabilitando el incorporado y poniendo el suyo propio)

+0

Esto no es posible sin copiar/pegar gran parte del código interno. Realmente tendría que llevar una motosierra a una implementación separada, por ejemplo, la de Apache Harmony. – jbellis

+0

@jbellis ¿por qué necesitarías copiar el código para subclase? –

+3

Aquí no puede obtener la funcionalidad deseada mediante la creación de subclases; demasiado es final/privado. – jbellis

2

La solución más obvia (puede o no ser apropiado dependiendo de sus circunstancias) sería simplemente crear una instancia de una nueva cola con la capacidad actualizada que desee. Luego, envía todo desde la cola anterior a la nueva cola.

+0

Si hace eso, todos los subprocesos con una referencia a la cola anterior serán bloqueados esperando nuevos contenidos en la cola anterior en lugar de nuevos contenidos en la nueva cola. –

+1

@bkail: Es por eso que dije "dependiendo de tus circunstancias". Si el OP tiene numerosas referencias a la cola de bloqueo, entonces tendrá que refactorizar para que esta solución funcione (por ejemplo, envolviendo la cola en sí misma dentro de un objeto contenedor que actúa como una cola externamente pero realiza nuevas asignaciones internamente cuando la capacidad es cambiado). –

Cuestiones relacionadas