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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top