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 ):
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.
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.
Sie können auf ähnliche Weise verwendet werden.
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.
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.
Tags und Links java concurrency go channel