NIO wurde geboren, um die Mängel von E/A-Operationen auszugleichen. Zu den neuen Funktionen von NIO gehören: nicht blockierende E/A, Selektoren, Puffer und Pipes. Kanal, Puffer und Selektor sind seine Hauptmerkmale.
Konzepterklärung:
Channel – Pipes sind eigentlich wie Streams in traditioneller IO, alle Daten zu jedem Ziel (oder von überall) müssen über ein Channel-Objekt geleitet werden. Ein Puffer ist im Wesentlichen ein Containerobjekt.
Selektor – Der Selektor wird zum Abhören von Ereignissen mehrerer Pipes verwendet. Bei Verwendung herkömmlicher blockierender E/A können wir leicht erkennen, wann Lese- und Schreibvorgänge ausgeführt werden können. Bei Verwendung nicht blockierender Kanäle benötigen wir jedoch einige Methoden wissen, was Wenn der Kanal bereit ist, wurde der Selektor für diesen Bedarf entwickelt.
Was ist der Unterschied zwischen NIO und traditionellem IO?
1. IO ist streamorientiert und NIO ist blockorientiert (pufferorientiert).
IO-Stream-orientierte Operationen verarbeiten Daten byteweise. Ein Eingabestream erzeugt ein Datenbyte und ein Ausgabestream verbraucht ein Datenbyte. , was zu einer schlechten Effizienz beim Lesen und Schreiben von Daten führt;
NIO-Block-orientierte Operationen erzeugen oder verbrauchen einen Datenblock in einem Schritt. Die Verarbeitung von Daten in Blöcken ist viel schneller als die Verarbeitung von Daten in (Streaming-)Bytes, während die Daten in einen Puffer gelesen werden, den sie später verarbeiten, und bei Bedarf im Puffer hin und her verschoben werden können. Dies erhöht die Flexibilität in der Verarbeitung. Laienhaft ausgedrückt verwendet NIO eine „Vorlesemethode“: Wenn Sie einen bestimmten Teil der Daten lesen, errät es die Daten, die Sie möglicherweise als nächstes lesen, und puffert sie im Voraus.
2. IO ist blockierend und NIO ist nicht blockierend.
Wenn ein Thread bei herkömmlicher E/A read() oder write() aufruft, wird der Thread blockiert, bis einige Daten gelesen oder die Daten vollständig geschrieben wurden. Während dieser Zeit kann der Thread nichts anderes tun.
Für NIO wird ein Thread verwendet, um eine Lesedatenanforderung zu senden. Bevor er eine Antwort erhält, ist der Thread inaktiv. Zu diesem Zeitpunkt kann der Thread andere Aufgaben ausführen, anstatt nur auf den Abschluss der Antwort zu warten wie in IO.
Anwendbare Szenarien für NIO und IO
NIO wurde geboren, um die Mängel des traditionellen IO auszugleichen, aber es hat seine Mängel und seine Stärken, da NIO pufferorientiert ist. Bei jeder Datenverarbeitung im Puffer muss vor der Datenverarbeitung beurteilt werden, ob die Daten vollständig sind oder ob sie gelesen wurden Teil gelesen wurde, macht es keinen Sinn, unvollständige Daten zu verarbeiten. Daher müssen die Pufferdaten vor jeder Datenverarbeitung erfasst werden.
Was sind also die anwendbaren Szenarien für NIO und IO?
Wenn Sie Tausende von Verbindungen verwalten müssen, die gleichzeitig geöffnet werden, und diese Verbindungen jedes Mal nur eine kleine Datenmenge senden, wie z. B. ein Chat-Server, dann kann die Verwendung von NIO zur Verarbeitung der Daten sinnvoll sein eine gute Wahl.
Wenn nur wenige Verbindungen vorhanden sind und diese Verbindungen jedes Mal eine große Datenmenge senden müssen, ist herkömmliches E/A besser geeignet. Welche Methode zur Datenverarbeitung verwendet werden soll, muss gegen die Antwortwartezeit der Daten und die Zeit zum Überprüfen der Pufferdaten abgewogen werden.
Beliebte Erklärung
Schließlich gibt es für NIO und traditionelles IO ein anschauliches Beispiel, das von einem Internetnutzer erwähnt wurde:
Der vorherige Stream war immer blockiert und ein Thread war nur erforderlich Wenn Sie einen Vorgang ausführen, werden andere Vorgänge blockiert, was einer Wasserleitung ohne Ventil entspricht. Wenn Sie nach Wasser greifen, können Sie unabhängig davon, ob das Wasser ankommt oder nicht, nur Zeit damit verbringen, Wasser zu empfangen (. fließen).
Das Hinzufügen von Nios Kanal entspricht dem Hinzufügen eines Wasserhahns (mit einem Ventil). Obwohl er jeweils nur Wasser aus einer Wasserleitung erhalten kann, ist dies nicht der Fall groß, das Wasser, das in jeder Wasserleitung fließt, kann richtig aufgenommen werden, das heißt, der Selektor ist für die Koordination verantwortlich Wasserleitung, im Moment Wenn das Wasser in der Wasserleitung einen bestimmten Stand erreicht, schalten Sie es um: Schließen Sie vorübergehend den aktuellen Wasserhahn und versuchen Sie, den anderen Wasserhahn zu öffnen (um zu sehen, ob Wasser vorhanden ist).
Wenn andere Menschen Wasser benötigen, holen sie das Wasser nicht direkt ab, sondern stellen im Voraus einen Eimer zur Verfügung. Dieser Eimer ist der Puffer. Das heißt, obwohl andere Leute möglicherweise warten müssen, werden sie nicht vor Ort warten. Sie können
andere Dinge tun werde sie benachrichtigen.
Dies kommt der Realität der aktuellen gesellschaftlichen Arbeitsteilung tatsächlich sehr nahe. Es ist auch eine sehr wirtschaftliche Möglichkeit, vorhandene Ressourcen zu nutzen, um gleichzeitige Effekte zu erzielen, anstatt nur auf Schritt und Tritt Parallelverarbeitung durchzuführen ist der effektivste Weg, aber auch der verschwenderischste Weg.
Das obige ist der detaillierte Inhalt vonDer Unterschied und anwendbare Szenarien zwischen NIO und IO in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!