2011-11-24 13 views
12

Quiero crear una cola de bloqueo que bloquee al productor en función de las reglas personalizadas en lugar del número de elementos en la cola.Cómo personalizar el comportamiento de bloqueo de BlockingQueue

Por ejemplo:

Productor produce algunos archivos y lo pone en una cola. El consumidor los transfiere a una ubicación específica después de algún análisis.

Para la situación anterior, quiero que el productor espere para producir nuevos archivos si el tamaño del total de archivos en la cola alcanza algún valor de umbral. Queue puede aceptar cualquier número de archivos si el tamaño total no cruza el valor de umbral.

+0

¿Has encontrado alguna solución hasta ahora? –

+0

Es una pregunta muy antigua. Y no usé colas de bloqueo en ninguna aplicación real todavía. Así que no me esforcé mucho para buscar una solución después de eso. –

Respuesta

3

que probablemente subclase un BlockingQueue como el ArrayBlockingQueue y añadir un simple CountDownLatch que se inicializa con el valor umbral y permite a los diversos take/remove métodos al llegar a 0.

+0

Esperaba que algún mecanismo incorporado provisto por Java para personalizar el comportamiento de bloqueo anulando algún método u otra cosa que no puede adivinar. Porque las reglas se pueden cambiar según la necesidad. –

+0

Puedo ver cómo esa clase podría ser útil. Sin embargo, no estoy del todo seguro de entender sus requisitos. Si 'take' debe bloquearse hasta que haya 10 elementos en la cola, ¿podría 'tomar' diez elementos, o debería esperar a que 9 elementos vuelvan a ser 10? – aioobe

+0

Para el escenario de prsented, 'take' no esperará hasta que la cola esté vacía. Pero 'put' esperará si el tamaño total de los archivos (** no el número de archivos **) cruzó el valor de thrashhold. Supongamos que el valor de thrashhold es 5mb y 'put' esperará si la cola tiene 1000 archivos de 5 KB o 100 archivos de 50 KB (en la figura aproximada). –

0

creo que tendrá que poner en práctica esta mecanismo de bloqueo usted mismo. Puede usar wait/notify o ReentrantLock/Condition, una variable larga que contiene la longitud combinada y una LinkedList que contiene los archivos.

+0

Esta es la última opción en mi cola de soluciones, como se sugirió @aioobe. :) –

Cuestiones relacionadas