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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top