Hai bisogno di una coda in grado di supportare più lettori
-
07-07-2019 - |
Domanda
Ho bisogno di una coda che può essere elaborata da più lettori.
I lettori elimineranno un elemento e lo invieranno a un servizio REST.
Ciò che è importante notare sono:
- Ogni lettore dovrebbe rimuovere gli elementi diversi. Se la coda ha elementi A, B & amp; C, il thread 1 dovrebbe dequeue A e il thread 2 dovrebbe dequeue B in modo simultaneo. E così via fino a quando non c'è nulla in coda.
- Comprendo che è impegnativo per la CPU eseguire sempre in un ciclo occupato, facendo capolino nella coda per gli elementi. Quindi non sono sicuro che una coda di blocco sia una buona opzione.
Quali sono le mie opzioni?
Soluzione
ConcurrentLinkedQueue o LinkedBlockingQueue sono due opzioni che mi viene subito in mente, a seconda che tu voglia bloccare il comportamento o meno.
Come osserva Adamski, il metodo take ()
del LinkedBlockingQueue
non brucia inutilmente i cicli della cpu mentre attende l'arrivo dei dati.
Altri suggerimenti
Dalla descrizione della tua domanda non sono sicuro se i thread debbano sgrassare gli elementi in modo rigorosamente round robin. Supponendo che questa non sia una limitazione, puoi usare il metodo BlockingQueue
take ()
, che causerà il blocco del thread fino a quando i dati non saranno disponibili (quindi non consuma CPU ).
Si noti inoltre che le implementazioni di take ()
sono atomiche (ad es. LinkedBlockingQueue
): se più thread sono bloccati su take ()
e un singolo elemento viene accodato, verrà restituita una sola chiamata take () del thread; l'altro rimarrà bloccato.
La principale differenza tra ConcurrentLinkedQueue e LinkedBLockingQueue è il suo throughput. Con una discussione moderata sul thread ConcurrentLinkedQueue esegue notevolmente tutti gli altri BlockingQueues. Sotto forte contesa, tuttavia, BlockingQueue è una scelta leggermente migliore in quanto inserirà opportunamente i thread contendenti nel set di thread in attesa.