2016-08-03 61 views
0

Ich las über gleichzeitige Warteschlange in Java, und ich erhielt Verwirrung über LinkedTransferQueue. Was ist der Typ von LinkedTransferQueue (ist es eine blockierende oder nicht blockierende Warteschlange)? Ich habe gelesen, dass LinkedTransferQueue eine CAS (vergleichen und tauschen) Ansatz und Park-Methode von Unsafe verwendet, und besteht aus Knoten und Zeigern wie ConcurrentLinkedQueue, es auf die Idee geschoben, dass es eine nicht blockierende Warteschlange ist. Aber Interface TransferQueue erweitert BlockingQueue. Es sieht mehrdeutig aus. Am Ende, ist LinkedTransferQueue blockierende oder nicht blockierende Warteschlange?Ist LinkedTransferQueue blockierende oder nicht blockierende Warteschlange?

+1

Fragen Sie sich, ob 'TransferQueue' blockiert oder ob' ConcurrentLinkedQueue' blockiert? Ersteres blockiert, letzteres ist nicht –

+0

Ich wundere mich, dass factual ConcurrentLinkedQueue blockiert, aber es wird implementiert, indem nicht blockierende Algorithmus, wegen dieser TransferQueue nicht erweitert werden muss BlockingQueue – pacman

+1

Warum fragen Sie nach 'TransferQueue' (die ist eine Schnittstelle) und "ConcurrentLinkedQueue" (was ist eine Klasse, die 'TransferQueue' nicht implementiert) in derselben Frage? Und was fragst du, wenn du das Javadoc liest? –

Antwort

2

Die LinkedTransferQueue ist eine unbegrenzte Warteschlange, obwohl es BlockingQueue ist, wird es nie tatsächlich erreichen die üblichen Produzenten/Verbraucher Muster normale BlockingQueue-Implementierungen erreichen können.

Also, ist es oder blockiert es nicht? Es hängt tatsächlich von der Operation ab. Zum Beispiel sind einige unten aufgeführt.

Nicht-blockierende Operationen:

  • offer
  • put
  • add
  • poll
  • tryTransfer

Blocking Operationen:

  • take
  • transfer

Punkt ist, wenn ein Betrieb erreichen kann, ohne zu blockieren, es wird. Da die LinkedTransferQueue gezwungen wird, unbegrenzt zu sein, kann sie sowohl mit blockierenden als auch mit nicht blockierenden Operationen auskommen.

Bei Interesse fand ich dies durch die Java-8-Implementierung.

+0

Danke für die Erklärungen über Methoden, es klärte die Situation. Wie unterscheidet man zwischen blockierenden und nicht blockierenden Methoden?Zweitens, was meintest du mit Producer/Consumer und LinkedTransferQueue? – pacman

+0

Ein typischer Produzent/Konsument ist etwas wie * Wenn es Platz in dieser Warteschlange gibt, setze dieses Element in die Warteschlange, wenn nicht warten bis Platz ist und umgekehrt *. Die 'LinkedTransferQueue' hat zwei Blockierungsmodi, da es keine feste Größe gibt. ** 1. ** Warten Sie, bis in dieser Warteschlange ein Element vorhanden ist. ** 2. ** Warten auf einen konsumierenden Thread in dieser Warteschlange –

+0

In Bezug auf die Unterscheidung. Ich habe mir den Code zum Putten angeschaut und es gibt eine Flagge, die sagt, welche Art von Operation wir machen sollten. 'SYNC',' ASYNC', 'JETZT',' ZEITLICH'. sync und timed sind Ihre blockierenden Operationen während async und jetzt nicht blockierend sind. –

-1

Vom Javadoc:

eine gegebenenfalls begrenzt Blockier Warteschlange basierend auf verknüpften Knoten.

+0

@downvoter Sich heute selbst zu bereichern. Ein Zitat aus dem Javdoc Hut beantwortet die Frage ist eine falsche Antwort? Du solltest Sun ablehnen, nicht ich. – EJP