I denne leksjonen blir vi kjent med Selector -klassen. Denne klassen er i java.nio.channels -pakken, så du trenger ikke å laste ned eller konfigurere noe for å bruke den. Et Selector- objekt kan overvåke ett eller flere kanalobjekter , sjekke deres beredskap til å lese/skrive osv. Og viktigst av alt, en selector trenger én strøm, ikke én strøm per kanal.

Vi lager velgere ved å bruke den statiske åpne metoden:


Selector selector = Selector.open();

Deretter kan kanaler registreres i et velgerobjekt:


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

Den andre parameteren i registermetoden bestemmer hvilken operasjon velgeren skal overvåke. Hvis du trenger å overvåke flere operasjoner samtidig, kan du bruke bitvis ELLER:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

Når en I/O-handling skjer på noen av kanalene, varsler velgeren oss. På denne måten kan du for eksempel lese data fra et stort antall datakilder.

Her må vi nevne at en kanal må være i ikke-blokkerende modus for at den skal kunne brukes med en velger:


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 at en velger ikke vil fungere med en FileChannel , fordi en FileChannel ikke kan byttes til ikke-blokkerende modus ( configurBlocking- metoden er deklarert i SelectableChannel- klassen, som FileChannel ikke arver).

Fra diagrammet kan du se at velgere er egnet å bruke med stikkontakter. Vi jobber med dem på slutten av den andre modulen.

Valgnøkkel

Når vi registrerer en kanal med en velger, får vi enValgnøkkelgjenstand. Dette objektet inneholder data om kanalregistrering.

Du kan bruke tasten for å finne ut om kanalen er klar for en viss verdi:


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

Tasten kan gi deg den tilsvarende kanalen og velgeren:


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

Du kan feste et hvilket som helst objekt til en nøkkel for å spore det i fremtiden. Dette kan gjøres enten under kanalregistrering (via det tredje argumentet) eller senere:

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

  2. nøkkel.vedlegg(objekt);

Senere kan du få det vedlagte objektet fra nøkkelen:


Object object = key.attachment();

Konklusjon

Etter å ha registrert kanaler med en velger, kan vi:

  • finn ut antall kanaler som er klare til å utføre spesifiserte operasjoner
  • blokkere kjøring av programmet vårt til minst én kanal er klar
  • få et sett med nøkler for klare kanaler
  • og mer

På slutten av den andre modulen skal vi prøve ut velgere i praksis.