Precisa de uma fila que pode suportar vários leitores
-
07-07-2019 - |
Pergunta
Eu preciso de uma fila que pode ser processado por vários leitores.
Os leitores vão desenfileirar um elemento e enviá-lo para um serviço REST.
O que é importante para nota são:
- Cada leitor deve ser dequeueing elementos diferentes. Se a fila tem elementos A, B e C, linha 1 deve retirar da fila A e Linha 2 deve retirar da fila B em forma concomitante. E assim por diante até que não há nada na fila.
- Eu entendo que é CPU intensivo para sempre correr em circuito ocupado, olhando para a fila de itens. Então, eu não tenho certeza se uma fila de bloqueio é uma boa opção.
Quais são as minhas opções?
Solução
ConcurrentLinkedQueue ou LinkedBlockingQueue são duas opções que imediatamente vêm à mente, dependendo se você deseja bloquear comportamento ou não.
notas Como Adamski, o método take()
do LinkedBlockingQueue
não desnecessariamente queimar ciclos de CPU enquanto aguarda dados para chegar.
Outras dicas
Não tenho a certeza de sua descrição questão de saber se os fios precisam elementos dequeue em um rigoroso modo round-robin. Assumindo que esta não é uma restrição que você pode usar o método BlockingQueue
de take()
, o que fará com que o thread para bloco até que os dados está disponível (portanto não consumir CPU ciclos).
Além disso, note que as implementações take()
são atômicas (por exemplo, LinkedBlockingQueue
): Se vários segmentos estão bloqueadas no take()
e um único elemento é enfileirado, em seguida, único tomada de rosca () chamada retornará; o outro permanecerá bloqueado.
A principal diferença entre ConcurrentLinkedQueue e LinkedBlockingQueue é o seu rendimento. Sob moderada ConcurrentLinkedQueue fio contenção muito fora executa todos os outros BlockingQueues. Sob contetion pesado, no entanto, um BlockingQueue é uma escolha um pouco melhor como ele vai colocar adequadamente tópicos em disputa no conjunto segmento de espera.