2009-05-06 3 views
16

Sto lavorando a un progetto che utilizza una coda che conserva informazioni sui messaggi che devono essere inviati agli host remoti. In tal caso, un thread è responsabile di inserire le informazioni nella coda e un altro thread è responsabile per ottenere informazioni dalla coda e inviarle. Il secondo thread deve controllare periodicamente la coda per le informazioni.Quali sono i vantaggi di Blocking Queue in Java?

Ma dopo ho scoperto che si tratta di una reinvenzione della ruota :) Potrei usare una coda di blocco per questo scopo.

Quali sono gli altri vantaggi dell'utilizzo di una coda di blocco per l'applicazione sopra? (Es: performance, modificabile del codice, eventuali trucchi speciali, ecc)

risposta

26

Il vantaggio principale è che un BlockingQueue fornisce una corretta attuazione thread-safe. Gli sviluppatori hanno implementato questa funzionalità da anni, ma è difficile adattarsi. Ora il runtime ha un'implementazione sviluppata, revisionata e gestita da esperti di concorrenza.

La natura di "blocco" della coda presenta un paio di vantaggi. Innanzitutto, aggiungendo elementi, se la capacità della coda è limitata, anche il consumo di memoria è limitato. Inoltre, se i consumatori della fila si spingono troppo oltre i produttori, i produttori sono naturalmente soffocati, poiché devono aspettare di aggiungere elementi. Quando si prendono elementi dalla coda, il vantaggio principale è la semplicità; aspettare per sempre è banale, e correttamente aspettare un timeout specificato è solo un po 'più complicato.

6

Essi cosa chiave si elimina con la coda di blocco è 'polling'. Questo è dove dici

In tal caso il secondo thread deve controllare periodicamente la coda per le informazioni.

Questo può essere molto inefficiente - utilizzando molto tempo CPU non necessario. Può anche introdurre latenze non necessarie.

12

Una coda di blocco è una coda che si blocca quando si tenta di disconnettersi da esso e la coda è vuota, o se si tenta di accodare gli elementi a esso e la coda è già piena. Un thread che tenta di disconnettere da una coda vuota viene bloccato fino a quando un altro thread inserisce un elemento nella coda. Un thread che tenta di accodare un elemento in una coda completa viene bloccato fino a quando un altro thread non fa spazio nella coda, eliminando uno o più elementi o eliminando completamente la coda.