2012-02-05 13 views
13

Quando si popola la coda dal contenuto del file, la profondità non sembra mai aumentare, poiché gli elementi non vengono aggiunti in questa implementazione.Coda piena, profondità della Coda bloccante, chiarimento necessario

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 
     } 

Quando si sostituisce offer con add, un'eccezione se gettato

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

Che cosa sto facendo di sbagliato per favore? Perché la coda è piena immediatamente, dopo l'inserimento del primo elemento?

risposta

17

Controllare la documentazione per SynchronousQueue:

Una coda di blocco in cui ogni put deve attendere un introito, e viceversa. Una coda sincrona non ha alcuna capacità interna, nemmeno una capacità di uno. Non si può dare una coda sincrona perché un elemento è presente solo quando si tenta di prenderlo; non è possibile aggiungere un elemento (utilizzando qualsiasi metodo) a meno che un altro thread non stia tentando di rimuoverlo; non si può iterare in quanto non c'è nulla da iterare. Il capo della coda è l'elemento che il primo thread in coda sta tentando di aggiungere alla coda; se non ci sono thread accodati, nessun elemento viene aggiunto e la testa è nulla. Ai fini di altri metodi di raccolta (ad esempio contiene), un SynchronousQueue funge da raccolta vuota. Questa coda non consente elementi null.

È necessario avere consumatori impostare e di attesa prima di poter provare ad aggiungere alla coda.

Il metodo offer non fa nulla se non ci sono i consumatori:

Inserisce l'elemento specificato in questa coda, se un altro thread è in attesa di riceverlo.

+3

RTFM ftw. Grazie Mat. Accetterà in 10 minuti – JAM

+16

In effetti, non puoi nemmeno RESPIRARE in presenza di una coda sincrona in quanto NON C'È ARIA DA RESPIRARE. Una coda sincrona è tutto e niente, è ovunque e da nessuna parte. Le implicazioni metafisiche della coda sincrona non possono essere comprese dai semplici abitanti della terra. – Tudor

2

Dal Javadoc:

.A blocco coda in cui ogni put deve attendere un take, e viceversa. Una coda sincrona non ha alcuna capacità interna, nemmeno una capacità di uno

1

È possibile utilizzare ArrayBlockingQueue. Questa è una coda di blocco limitata supportata da un array. Questa coda ordina elementi FIFO (first-in-first-out). ArrayBlockingQueue è un classico "buffer limitato", in cui un array di dimensioni fisse contiene elementi inseriti dai produttori ed estratti dai consumatori. http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (per coloro che hanno anche calpestato un rake)