In dieser Lektion machen wir uns mit der Selector- Klasse vertraut . Diese Klasse ist im Paket java.nio.channels enthalten, Sie müssen also nichts herunterladen oder konfigurieren, um sie zu verwenden. Ein Selector- Objekt kann ein oder mehrere Channel- Objekte überwachen, ihre Lese-/Schreibbereitschaft prüfen usw. Und am wichtigsten ist, dass ein Selector einen Stream benötigt, nicht einen Stream pro Kanal.

Wir erstellen Selektoren mit der statischen Open- Methode:


Selector selector = Selector.open();

Danach können Kanäle in einem Selektorobjekt registriert werden:


SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

Der zweite Parameter der Registermethode bestimmt, welche Operation der Selektor überwacht. Wenn Sie mehrere Vorgänge gleichzeitig überwachen müssen, können Sie bitweise ODER verwenden:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

Wenn auf einem der Kanäle eine E/A-Aktion auftritt, benachrichtigt uns der Selektor. Auf diese Weise können Sie beispielsweise Daten aus einer Vielzahl von Datenquellen lesen.

Hier müssen wir erwähnen, dass sich ein Kanal im nicht blockierenden Modus befinden muss, damit er mit einem Selektor verwendet werden kann:


channel1.configureBlocking(false);
channel2.configureBlocking(false);
SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

Daraus folgt, dass ein Selektor nicht mit einem FileChannel funktioniert , da ein FileChannel nicht in den nicht blockierenden Modus geschaltet werden kann (die Methode configureBlocking ist in der SelectableChannel- Klasse deklariert , die FileChannel nicht erbt).

Aus dem Diagramm können Sie ersehen, dass Selektoren für die Verwendung mit Steckdosen geeignet sind. Wir werden am Ende des zweiten Moduls mit ihnen arbeiten.

Auswahlschlüssel

Wenn wir einen Kanal mit einem Selektor registrieren, erhalten wir eineAuswahlschlüsselObjekt. Dieses Objekt enthält Daten zur Kanalregistrierung.

Mit der Taste können Sie feststellen, ob der Kanal für einen bestimmten Wert bereit ist:


key.isReadable()
key.isAcceptable()
key.isConnectable()
key.isWritable()

Mit der Taste erhalten Sie den entsprechenden Kanal und Selektor:


Channel channel = key.channel();
Selector selector = key.selector();

Sie können ein beliebiges Objekt an einen Schlüssel anhängen, um es in Zukunft zu verfolgen. Dies kann entweder während der Kanalregistrierung (über das dritte Argument) oder später erfolgen:

  1. SelectionKey key = channel.register(selector, SelectionKey.OP_ACCEPT, object);

  2. key.attach(object);

Später können Sie das angehängte Objekt über den Schlüssel abrufen:


Object object = key.attachment();

Abschluss

Nachdem wir Kanäle mit einem Selektor registriert haben, können wir:

  • Ermitteln Sie die Anzahl der Kanäle, die zur Ausführung bestimmter Vorgänge bereit sind
  • Blockieren Sie die Ausführung unseres Programms, bis mindestens ein Kanal bereit ist
  • Holen Sie sich einen Satz Schlüssel für bereite Kanäle
  • und mehr

Am Ende des zweiten Moduls werden wir Selektoren in der Praxis ausprobieren.