Heim  >  Artikel  >  Java  >  Nicht blockierender Server in Java NIO

Nicht blockierender Server in Java NIO

王林
王林nach vorne
2023-08-19 18:49:071234Durchsuche

Java NIO中的非阻塞服务器

Nicht blockierender Server

Java NIO (New Input/Output) ist eine sehr leistungsstarke Netzwerk- und Dateiverwaltungsanwendung, die als Alternative zur Standard-IO-API von Java fungiert. Aufgrund der Hinzufügung ausgefeilterer Funktionen seit der Einführung von JDK 4 hat sie sich schnell als bevorzugte Anwendung herausgestellt I/O-System unter zahlreichen Ingenieuren.

Die verbesserte Unterstützung für die Dateiverwaltung und Dateisystemfunktionalität, die Java NIO bietet, ist eines seiner Alleinstellungsmerkmale. Da die NIO-Dateiklasse über so leistungsstarke Funktionen verfügt, wird sie häufig in der Dateiverarbeitung verwendet.

Wenn Sie genau hinsehen, werden Sie feststellen, dass das Paket java.nio die in der NIO-API verwendeten Pufferklassen angibt. Das Beste daran ist, dass es entwickelt wurde, um Java-Programmierern eine schnelle E/A zu ermöglichen, ohne nativen Code schreiben zu müssen.

Blockierende und nicht blockierende E/A

Aufgrund der Verwendung nicht blockierender E/A kann ein nicht blockierender Server mehrere Anfragen gleichzeitig über denselben Prozess oder Thread verarbeiten. Stellen Sie sich den Sperrvorgang wie eine Warteschlange an einem Ticketschalter vor, wo jeder Kunde warten muss, bis die Person vor ihm bedient wird, bevor er fortfahren kann.

Im Gegensatz dazu ist ein nicht blockierender Prozess wie ein Kellner in einem Restaurant, der versucht, alle Kunden gleichzeitig zu bedienen, indem er sie durchläuft und sich um ihre Bestellungen kümmert.

Der Blockierungsserver arbeitet synchron und schließt jede Anfrage ab, bevor er mit der nächsten fortfährt. Dies kann zu langen Client-Wartezeiten führen und erfordert mehrere Threads zur Bearbeitung jeder Anfrage, was die CPU-Beanspruchung erhöht. Nicht blockierende Server hingegen verfolgen einen asynchronen Ansatz, der es einem Thread ermöglicht, mehrere Abfragen gleichzeitig zu bearbeiten und auf den Abschluss jeder Anforderung zu reagieren.

Funktionen von Java NIO

Java NIO verfügt über einige einzigartige Funktionen, die es von anderen IO-Systemen unterscheiden. Im Folgenden sind die Hauptfunktionen von Java NIO aufgeführt:

  • Asynchrones und nicht blockierendes IO – Mit dieser Funktion können Threads andere Aufgaben ausführen, während Daten in einen Puffer eingelesen werden, anstatt darauf zu warten, dass die Daten vollständig geladen werden, bevor die Verarbeitung beginnt, können Threads ihre Arbeit fortsetzen Daten werden gelesen.

  • Pufferorientierter Ansatz − Java NIO speichert Daten in Puffern, damit sie schnell abgerufen und verarbeitet werden können. Wenn Daten benötigt werden, werden sie aus dem Puffer abgerufen und verarbeitet.

Algorithmus

  • Schritt 1 − Zunächst müssen wir die erforderlichen Klassen mithilfe der Importanweisung importieren.

  • Schritt 2 − Als nächstes müssen wir eine öffentliche Klasse mit dem Namen „WriteExample2“ erstellen.

  • Schritt 3 - Innerhalb dieser Klasse müssen wir eine öffentliche statische void-Hauptfunktion definieren, die Variablenargumente vom Typ String akzeptiert.

  • Schritt 4 − Erstellen Sie nun eine temporäre Datei mit der Erweiterung „.txt“, indem Sie die Methode Files.createTempFile() verwenden. Zum Schreiben können wir die Methode Files.write() zusammen mit einem iterierbaren Objekt verwenden, das die Datei enthält Zeichenfolgen „Hallo“ und „Welt“.

  • Schritt 5 - Um jedes Byte aus der Datei zu lesen, die durch das von der Funktion „createTempFile()“ der Dateien zurückgegebene Path-Objekt definiert wird, können wir die Funktion „Files.readAllBytes()“ verwenden. Danach müssen wir sie in a konvertieren String mit dem neuen String()-Konstruktor.

  • Schritt 6 − Drucken Sie abschließend den String mit der Methode System.out.println() auf der Konsole aus.

Beispiel 1

Dieser Java-Code erstellt eine temporäre Textdatei und schreibt „Hallo“ und „Welt“ in diese. Anschließend liest er die Datei und gibt ihren Inhalt aus. Der Code verwendet die Dateiklasse aus dem Java-NIO-Paket, um Dateioperationen durchzuführen

package com.tutorialspoint.example.files;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;

public class WriteExample2 {
   public static void main(String... args) throws IOException {
      Path path = Files.createTempFile("test-file", ".txt");
      Iterable<String> iterable = Arrays.asList("Hello", "world");
      Files.write(path, iterable);
      byte[] bytes = Files.readAllBytes(path);
      System.out.println(new String(bytes));
   }
}

Ausgabe

Hello
world

Komponenten von Java NIO

Java NIO basiert auf drei grundlegenden Komponenten: Puffer, Kanäle und Selektoren. Hier ist ein kurzer Überblick über die einzelnen Komponenten

  • Puffer

    − Ein Puffer ist ein Speicherblock, der zum vorübergehenden Speichern von Daten verwendet wird, während diese von einem Ort an einen anderen übertragen werden. In Java NIO werden Puffer zum einfachen Lesen und Schreiben von Daten verwendet.

  • Kanäle

    – In Java NIO stellen Kanäle Verbindungen zu Objekten dar, die IO-Vorgänge ausführen können, wie z. B. Dateien und Sockets. Kanäle sind für die Datenübertragung zwischen Puffern und den von ihnen dargestellten Objekten verantwortlich.

  • Selektoren

    − Ein Selektor ist eine Java-NIO-Komponente, die dazu dient, einen oder mehrere Kanäle auf Ereignisse zu überwachen, z. B. die Bereitschaft zur Durchführung einer E/A-Operation. Wenn ein Kanal bereit ist, kann der Selektor aufwachen und den entsprechenden Thread zulassen um die Operation abzuwickeln.

  • Nicht blockierende Serverzusammensetzung

Nicht blockierende Server bestehen aus einer nicht blockierenden E/A-Pipeline, einer Kette von Komponenten, die sowohl Lese- als auch Schreib-E/A-Vorgänge nicht blockierend verarbeiten. Hier ist eine Aufschlüsselung der Funktionsweise dieser Pipeline
  • Ein Selektor wird von jeder Komponente in der Pipeline verwendet, um zu bestimmen, ob ein Kanal Daten zum Lesen hat.

  • Wenn Daten vorhanden sind, liest die Komponente diese und stellt darauf basierend eine Ausgabe bereit. Anschließend wird die Ausgabe zurück in den Kanal geschrieben.

  • Basierend auf Komponenten können nicht blockierende E/A-Pipes Daten lesen und schreiben sowie beide Vorgänge ausführen.

  • Diese Komponente liest Daten vom Kanal über einen Selektor. Java NIO verwaltet nicht blockierende E/A-Operationen, während Selektoren und auswählbare Kanalauswahltasten gemultiplexte E/A-Operationen definieren.

  • Nicht blockierende E/A-Pipelines unterteilen Daten in logisch geordnete oder kombinierte Nachrichten neben der nicht blockierenden Datenverarbeitung. Dies ist vergleichbar mit der Verwendung der StreamTokenizer-Klasse von Java, um einen Datenstrom vor der Verarbeitung zu tokenisieren.

  • Nicht blockierende Modelle verwenden Java-NIO-Selektoren, um nur die SelectableChannel-Instanzen zu prüfen und bereitzustellen, die Daten zum Lesen haben, im Gegensatz zu blockierenden IO-Pipelines, die eine Schnittstelle ähnlich wie InputStream verwenden und jeweils nur das Lesen eines Bytes zulassen.

Vergleich von blockierenden und nicht blockierenden Modellen für Server-Lese-/Schreibvorgänge

In der Welt der Serverarchitektur kann die Wahl eines blockierenden oder nicht blockierenden Modells für Lese- und Schreibvorgänge großen Einfluss auf die Effizienz und Skalierbarkeit des Servers haben.

Das nicht blockierende Modell ist das Gegenteil des blockierenden Modells, das es einem Prozess ermöglicht, mehrere gleichzeitige Anforderungen durch Verschachtelung nicht blockierender E/A-Aufrufe zu verarbeiten.

Um den Unterschied zwischen diesen Modellen zu veranschaulichen, betrachten wir einen hypothetischen Server, der zwei Anfragen empfängt. In einem blockierenden Modell muss der Prozess warten, bis die Anfrage A vollständig verarbeitet ist, bevor er mit der Anfrage B fortfährt. Im Gegensatz dazu ist es ein nicht blockierendes Modell kann beide Anfragen gleichzeitig bearbeiten, indem die Verarbeitung der Anfragen A und B verschachtelt wird.

Java NIO ermöglicht einem einzelnen Thread die Steuerung mehrerer Kanäle und unterstützt nicht blockierende E/A.

Die Kanäle, die einen Puffer und ein Objekt am anderen Ende verbinden, ermöglichen eine asynchrone Datenübertragung. Zwei Klassen, SocketChannel und ServerSocketChannel, implementieren den Java NIO-Kanal und ermöglichen das Empfangen und Schreiben von Daten über TCP-Verbindungen.

Serverarchitekten können Systeme erstellen, die effektiv und skalierbar sind und zahlreiche gleichzeitige Anforderungen verwalten können, indem sie das richtige E/A-Modell auswählen.

Fazit

Java NIO bietet eine leistungsstarke Netzwerk- und Dateiverwaltungsanwendung mit verbesserter Unterstützung für Dateiverwaltung und Dateisystemfunktionen. Sein asynchroner und nicht blockierender E/A-Ansatz und die drei grundlegenden Komponenten Puffer, Kanäle und Selektoren machen es möglich Es ist ein einzigartiges I/O-System.

Das nicht blockierende Servermodell von Java NIO ist in der Lage, mehrere Anfragen gleichzeitig zu verarbeiten, indem es nicht blockierende E/A-Pipes verwendet. Im Gegensatz zu blockierenden E/A-Pipes prüft und stellt das nicht blockierende Modell nur diejenigen SelectableChannel-Instanzen bereit, die tatsächlich Daten zum Lesen haben, was es zu einem schnelleren und effizienteren System macht.

Das obige ist der detaillierte Inhalt vonNicht blockierender Server in Java NIO. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen