Gehe Kanal vs. Java BlockingQueue

7

Gibt es Unterschiede zwischen einem Go-Kanal und einer Java-BlockingQueue? Beide sind Warteschlangen mit ähnlicher Blockierungs- und Speichermodellsemantik. Optional können beide eine Kapazität haben.

    
rrevo 21.05.2012, 18:14
quelle

4 Antworten

12

Ich würde sagen, der größte Unterschied besteht darin, dass Go-Kanäle Unterstützung für die Anweisung select haben, mit der Sie genau einen Kanal ausführen können. Ein Beispiel (geändert von der Go-Sprachspezifikation ):

%Vor%

In diesem Beispiel wird genau eine der Operationen receive-from-c1, send-to-c2 oder receive-from-c3 ausgeführt. Wenn Sie die Auswahl eingeben, wird (falls vorhanden) ein bereitgestellter Kanal zufällig ausgewählt. Andernfalls blockiert die Operation, bis einer der Kanäle bereit ist.

Mir ist keine einfache Möglichkeit bekannt, diese Kanalauswahl mit den Java-Dienstprogrammen zu modellieren. Man könnte argumentieren, dass dies eine Eigenschaft der select Aussage ist und nicht das Design von Kanälen, aber ich würde argumentieren, dass dies für das Design von Kanälen grundlegend ist.

    
Brett Kail 21.05.2012, 22:12
quelle
5

Noch ein sehr wichtiger Unterschied ist: Sie können einen Go-Kanal schließen, um zu signalisieren, dass keine Elemente mehr kommen. Das ist mit Java nicht möglich.

Beispiel: goroutine A liest eine Liste von Dateien. Es postet jede Datei in den Channel. Nach der letzten Datei schließt es den Kanal. goroutine B liest die Dateien aus dem Kanal und verarbeitet sie auf irgendeine Weise. Nachdem der Kanal geschlossen wurde, wird die Goroutine beendet.

Dies ist in Java nicht einfach möglich; Es gibt jedoch einige Problemumgehungen.

    
Kosta 21.09.2013 19:26
quelle
3

Sie können auf ähnliche Weise verwendet werden.

  • Beide können blockieren beim Senden / Senden oder Empfangen / Empfangen.
  • Beide haben eine Kapazität, die regelt, wann das Senden blockiert wird.

Die größten Unterschiede sind wahrscheinlich, dass Go-Kanäle wesentlich billiger sind als ein Java-Objekt. und dass Go-Channels eingeschränkt werden können, um nur zu senden oder nur zu empfangen, was eine zusätzliche Art der Durchsetzung sicherstellen kann, wer senden kann und wer von einem Channel empfangen kann.

    
Jeremy Wall 21.05.2012 19:50
quelle
3

Etwas Ähnliches wie die Anweisung golang'select in Java zu tun, würde die Verwendung des Pakets java.nio beinhalten. Speziell Selektoren und Kanäle. Sehen Sie sich die Paketdokumentation hier an:

Ссылка

Es bietet die gleiche Funktionalität wie die Anweisung golang select, indem es einen einzelnen Thread zum Multiplexen von Lesen / Schreiben aus mehreren Kanälen verwendet.

    
user2765592 10.09.2013 15:24
quelle

Tags und Links