Question

J'ai besoin d'une file d'attente pouvant être traitée par plusieurs lecteurs.

Les lecteurs vont retirer de la file d'attente un élément et l'envoyer à un service REST.

Les points importants à noter sont les suivants:

  • Chaque lecteur doit retirer de la file d'attente différents éléments. Si la file d'attente contient les éléments A, B & amp; C, le fil 1 devrait retirer de la file d'attente A et le fil 2, de la file d'attente B de manière concurrente. Et ainsi de suite jusqu'à ce qu'il n'y ait plus rien dans la file d'attente.
  • Je comprends qu’il faut beaucoup de temps au processeur pour s’exécuter en boucle occupée, en jetant un coup d’œil furtif dans la file d’attente. Je ne suis donc pas sûr de savoir si une file d'attente de blocage est une bonne option.

Quelles sont mes options?

Était-ce utile?

La solution

ConcurrentLinkedQueue ou LinkedBlockingQueue sont deux options qui vient immédiatement à l’esprit, selon que vous souhaitiez un comportement bloquant ou non.

Comme le note Adamski, la méthode take () de LinkedBlockingQueue ne grave pas inutilement les cycles du processeur en attendant que les données arrivent.

Autres conseils

D'après la description de votre question, je ne suis pas sûr si les threads doivent supprimer les éléments de la file d'attente de manière strictement circulaire. En supposant qu'il ne s'agisse pas d'une restriction, vous pouvez utiliser la méthode take () de BlockingQueue , ce qui entraînera le blocage du thread jusqu'à ce que les données soient disponibles (par conséquent, ne consomme pas CPU ).

Notez également que les implémentations take () sont atomiques (par exemple, LinkedBlockingQueue ): Si plusieurs threads sont bloqués sur take () et qu'un seul élément est mis en file d'attente, puis un seul fil de l'appel à take () retournera; l'autre restera bloqué.

La principale différence entre ConcurrentLinkedQueue et LinkedBLockingQueue est son débit. Sous concurrence de thread modérée, ConcurrentLinkedQueue surpasse largement toutes les autres BlockingQueues. En cas de contetion importante, une BlockingQueue est un choix légèrement meilleur car elle placera correctement les threads en conflit dans le jeu de threads en attente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top