Frage

Ich brauche eine Warteschlange, die durch mehrere Leser verarbeitet werden kann.

Die Leser werden ein Element aus der Warteschlange entfernt und an einen REST-Dienst senden.

Was ist wichtig zu beachten sind:

  • sollten Jeder Leser verschiedene Elemente werden Warteschlangenauflösungs. Wenn die Warteschlangenelemente A, B & C, A Thread 1 sollte aus der Warteschlange entfernt und Thread 2 sollte B in gleichzeitiger Art und Weise aus der Warteschlange entfernt. Und so weiter, bis es gibt nichts in der Warteschlange.
  • Ich verstehe, dass es ist viel CPU-Kapazität immer in stark frequentierten Schleife zu laufen, in die Warteschlange späht nach Artikeln. So bin ich nicht sicher, ob eine Blockierung Warteschlange eine gute Option ist.

Was sind meine Optionen?

War es hilfreich?

Lösung

ConcurrentLinkedQueue oder LinkedBlockingQueue sind zwei Optionen, die sofort in den Sinn kommen, je nachdem, ob Sie das Verhalten wollen blockiert oder nicht.

Wie Adamski bemerkt, wird die take() Methode des LinkedBlockingQueue nicht unnötig CPU-Zyklen verbrennen, während auf Daten warten zu gelangen.

Andere Tipps

Ich bin nicht sicher, ob aus Ihrer Frage Beschreibung, ob die Fäden Elemente in einem strengen reihum aus der Warteschlange entfernt benötigen. Unter der Annahme, dies ist keine Einschränkung Sie BlockingQueue die take() Methode verwenden können, die das Gewinde verursacht zu blockieren, bis Daten verfügbar sind (also nicht CPU Zyklen aufwendig).

Beachten Sie auch, dass take() Implementierungen Atom sind (zB LinkedBlockingQueue ): Wenn mehrere Threads blockiert sind, wird dann eine auf take() und ein einzelnes Element die Warteschlange eingereiht nur Threads nehmen () -Aufruf zurückkehren; der andere wird blockiert bleiben.

Der wesentliche Unterschied zwischen ConcurrentLinkedQueue und LinkedBlockingQueue ist ihr Durchsatz. Unter leichtem Thread-Konkurrenz führt stark aus ConcurrentLinkedQueue alle anderen BlockingQueues. Unter schwerer contetion ist jedoch ein Blocking eine etwas bessere Wahl, da sie in geeigneter Weise streitenden Fäden in den wartenden Thread Satz setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top