2011-11-24 9 views
12

Desidero creare una coda di blocco che blocchi il produttore in base a regole personalizzate anziché al numero di elementi nella coda.Come personalizzare il comportamento di blocco di BlockingQueue

Ad esempio:

Produttore produce alcuni file e lo mette in una coda. Il consumatore li trasferisce in una posizione specifica dopo alcune analisi.

Per lo scenario precedente, voglio che il produttore attenda di produrre nuovi file se la dimensione dei file totali nella coda raggiunge un valore di soglia. La coda può accettare qualsiasi numero di file se le dimensioni totali non superano il valore soglia.

+0

hai trovato qualche soluzione fino ad ora? –

+0

È una domanda molto vecchia. E non ho ancora usato code di blocco in nessuna applicazione reale. Quindi non ho provato molto a cercare una soluzione dopo. –

risposta

3

avrei probabilmente sottoclasse un BlockingQueue come il ArrayBlockingQueue e aggiungere un semplice CountDownLatch che viene inizializzato al valore di soglia e permette alle varie take/remove metodi quando si raggiunge 0.

+0

Mi aspettavo del mecanismo integrato fornito da java per personalizzare il comportamento di blocco sovrascrivendo un metodo o qualcos'altro che non è possibile indovinare. Perché le regole possono essere modificate secondo le necessità. –

+0

Posso vedere come tale classe potrebbe essere utile. Non sono del tutto sicuro di aver capito le tue esigenze. Se 'take' dovrebbe bloccare fino a quando tere è 10 elementi nella coda, dovrei essere in grado di" prendere "dieci elementi allora, o dovrei aspettare 9 elementi per diventare nuovamente 10? – aioobe

+0

Per lo scenario esposto, 'take' non aspetterà che la coda sia vuota. Ma 'put' aspetterà se la dimensione totale dei file (** non il numero di file **) ha superato il valore del thrashhold. Supponiamo che il valore del thrashhold sia 5mb, quindi "put" aspetterà se la coda ha 1000 file di 5 KB o 100 file di 50 KB (in forma approssimativa). –

0

penso che si dovrà attuare questa meccanismo di bloccaggio da soli. È possibile utilizzare wait/notify o ReentrantLock/Condition, una variabile lunga contenente la lunghezza combinata e una LinkedList che contiene i file.

+0

Questa è l'ultima opzione nella coda della mia soluzione come suggerito da @aioobe. :) –

Problemi correlati