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?
Antwort
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.
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
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 –
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. Android: blockierende oder nicht blockierende Warteschlange für fortlaufende SQL-Einsätze?
- 2. pthread synchronisierte blockierende Warteschlange
- 3. Warum sollte ich nicht blockierende oder blockierende Sockets verwenden?
- 4. implementieren-your-own blockierende Warteschlange in Java
- 5. Nicht blockierende Eingabeaufforderung? node.js
- 6. Nicht blockierende gleichzeitige Sammlung?
- 7. Scrapy: nicht blockierende Pause
- 8. Nicht blockierende Verbindung
- 9. pyserial nicht blockierende Leseschleife
- 10. php socket_write über blockierende und nicht blockierende Sockets
- 11. PHP nicht blockierende Anwendungen schreiben
- 12. Nicht blockierende Socket mit TCP
- 13. Nicht blockierende IO für Android
- 14. Nicht blockierende Darstellung in ReactJS
- 15. Nicht blockierende Warte in Python
- 16. Nicht blockierende Messagebox & DllImport Nachteile
- 17. Nicht blockierende Version des Systems()
- 18. Nicht blockierende Verbindung in Linux
- 19. Linux, Sockets, nicht blockierende Verbindung
- 20. MPI nicht blockierende Sende/recv
- 21. Nicht blockierende HTTP-Request-Schleife
- 22. MPI: Blockierung vs nicht blockierende
- 23. Nicht blockierende Leitung mit popen?
- 24. Tornado blockierende asynchrone Anfragen
- 25. Plotlinien ohne blockierende Ausführung
- 26. Würde einen Thread beenden, der auf eine blockierende Warteschlange wartet
- 27. Youtube blockierende Menüs
- 28. WScript.Shell und blockierende Ausführung?
- 29. express bodyParser blockierende Ereignisschleife
- 30. Wie funktioniert Linux-blockierende E/A tatsächlich?
Fragen Sie sich, ob 'TransferQueue' blockiert oder ob' ConcurrentLinkedQueue' blockiert? Ersteres blockiert, letzteres ist nicht –
Ich wundere mich, dass factual ConcurrentLinkedQueue blockiert, aber es wird implementiert, indem nicht blockierende Algorithmus, wegen dieser TransferQueue nicht erweitert werden muss BlockingQueue – pacman
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? –