I denne lektion vil vi stifte bekendtskab med Selector -klassen. Denne klasse er i java.nio.channels- pakken, så du behøver ikke at downloade eller konfigurere noget for at bruge den. Et Selector- objekt kan overvåge et eller flere kanalobjekter , kontrollere deres klarhed til at læse/skrive osv. Og vigtigst af alt, en selector har brug for én stream, ikke én stream pr. kanal.

Vi opretter vælgere ved hjælp af den statiske åbne metode:


Selector selector = Selector.open();

Derefter kan kanaler registreres i et vælgerobjekt:


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

Den anden parameter i registermetoden bestemmer, hvilken operation vælgeren vil overvåge. Hvis du skal overvåge flere operationer på én gang, kan du bruge bitvis ELLER:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

Når der sker en I/O-handling på en af ​​kanalerne, giver vælgeren os besked. På den måde kan du for eksempel læse data fra en lang række datakilder.

Her skal vi nævne, at en kanal skal være i ikke-blokerende tilstand, for at den kan bruges med en vælger:


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

Det følger heraf, at en selector ikke vil fungere med en FileChannel , fordi en FileChannel ikke kan skiftes til ikke-blokerende tilstand ( configurBlocking- metoden er erklæret i SelectableChannel- klassen, som FileChannel ikke arver).

På diagrammet kan du se, at vælgere er velegnede til at bruge med stikkontakter. Vi vil arbejde med dem i slutningen af ​​andet modul.

Selection Key

Når vi registrerer en kanal med en vælger, får vi enSelection Keyobjekt. Dette objekt indeholder data om kanalregistrering.

Du kan bruge tasten til at bestemme, om kanalen er klar til en bestemt værdi:


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

Tasten kan give dig den tilsvarende kanal og vælger:


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

Du kan vedhæfte enhver genstand til en nøgle for at spore den i fremtiden. Dette kan gøres enten under kanalregistrering (via det tredje argument) eller senere:

  1. SelectionKey key = kanal.register(selektor, SelectionKey.OP_ACCEPT, objekt);

  2. key.attach(objekt);

Senere kan du få det vedhæftede objekt fra nøglen:


Object object = key.attachment();

Konklusion

Efter at have registreret kanaler med en vælger, kan vi:

  • find ud af antallet af kanaler, der er klar til at udføre specificerede operationer
  • blokere udførelse af vores program, indtil mindst én kanal er klar
  • få et sæt nøgler til klar kanaler
  • og mere

I slutningen af ​​andet modul vil vi afprøve vælgere i praksis.