2012-02-05 11 views
13

Al llenar la cola de los contenidos del archivo, la profundidad no parece aumentar siempre, ya que los elementos no se agregan en esta implementación.Cola llena, profundidad de la cola de bloqueo, se necesita aclaración

BlockingQueue<String> q = new SynchronousQueue<String>(); 
      ... 
     fstream = new FileInputStream("/path/to/file.txt"); 
      ... 
     while ((line = br.readLine()) != null) { 
      if (q.offer(line)) 
       System.out.println("Depth: " + q.size()); //0 
     } 

Al sustituir offer con add, salvo si se tiran

Exception in thread "main" java.lang.IllegalStateException: Queue full 
    ... 

¿Qué estoy haciendo mal por favor? ¿Por qué la cola está llena inmediatamente después de la inserción del primer elemento?

Respuesta

17

revise la documentación de SynchronousQueue:

Una cola de bloqueo en la que cada puesto tiene que esperar a una toma, y ​​viceversa. Una cola síncrona no tiene ninguna capacidad interna, ni siquiera una capacidad de. No puede echar un vistazo a una cola sincrónica porque un elemento solo está presente cuando intenta tomarlo; no puede agregar un elemento (utilizando cualquier método) a menos que otro hilo esté intentando eliminarlo; no puede iterar ya que no hay nada que iterar. El encabezado de la cola es el elemento que el primer subproceso en cola intenta agregar a la cola; si no hay subprocesos en cola, entonces no se agrega ningún elemento y el encabezado es nulo. Para los fines de otros métodos de recopilación (por ejemplo, contiene), un SynchronousQueue actúa como una colección vacía. Esta cola no permite elementos nulos.

Es necesario que los consumidores configuren y esperen antes de poder intentar agregar a la cola.

El método offer no hace nada si no hay consumidores:

Inserta el elemento especificado en esta cola, si otro subproceso está esperando para recibirlo.

+3

RTFM ftw. Gracias Mat. Aceptará en 10 minutos – JAM

+16

De hecho, no puede incluso RESPIRACIÓN en presencia de una cola sincrónica ya que NO HAY AIRE PARA RESPIRAR. Una cola sincrónica es todo y nada, está en todas partes y en ninguna parte. Las implicaciones metafísicas de la cola sincrónica no pueden ser entendidas por simples habitantes de la tierra. – Tudor

2

Desde el Javadoc:

.A cola de bloqueo en la que cada puesto tiene que esperar a una toma, y ​​viceversa. Una cola sincrónica no tiene ninguna capacidad interna, ni siquiera una capacidad de

1

Puede usar ArrayBlockingQueue. Esta es una cola de bloqueo limitada respaldada por una matriz. Esta cola ordena elementos FIFO (primero en entrar, primero en salir). ArrayBlockingQueue es un clásico "buffer delimitado", en el que una matriz de tamaño fijo contiene elementos insertados por los productores y extraídos por los consumidores. http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (para aquellos que también pisaron un rastrillo)