Ebben a leckében a Selector órával ismerkedünk meg . Ez az osztály a java.nio.channels csomagban található , így nem kell letöltenie vagy konfigurálnia semmit a használatához. A Selector objektum egy vagy több csatornaobjektumot figyelhet , ellenőrizheti azok olvasási/írási készségét stb. És ami a legfontosabb, egy szelektornak egy adatfolyamra van szüksége, nem pedig csatornánként egy adatfolyamra.

A statikus nyitott módszerrel kiválasztókat készítünk :

Selector selector = Selector.open();

Ezt követően a csatornák egy szelektor objektumban regisztrálhatók:

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

A regiszter módszer második paramétere határozza meg, hogy a szelektor melyik műveletet fogja figyelni. Ha egyszerre több műveletet kell figyelnie, használhatja a bitenkénti VAGY:

SelectionKey.OP_READ | SelectionKey.OP_WRITE

Ha valamelyik csatornán I/O művelet történik, a választó értesít minket. Így például számos adatforrásból olvashat ki adatokat.

Itt meg kell említenünk, hogy egy csatornának nem blokkoló módban kell lennie ahhoz, hogy választóval használható legyen:

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

Ebből következik, hogy a szelektor nem fog működni a FileChannel -el , mert a FileChannel nem váltható át nem blokkoló módba (a configureBlocking metódus a SelectableChannel osztályban van deklarálva, amit a FileChannel nem örököl).

A diagramból látható, hogy a szelektorok alkalmasak a foglalatokhoz. A második modul végén dolgozunk velük.

Selection Key

Csatorna szelektorral történő regisztrálásakor aSelection Keytárgy. Ez az objektum a csatorna regisztrációs adatait tartalmazza.

A gomb segítségével meghatározhatja, hogy a csatorna készen áll-e egy bizonyos értékre:

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

A gomb megadhatja a megfelelő csatornát és választót:

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

Bármilyen objektumot csatolhat egy kulcshoz, hogy a jövőben nyomon követhesse. Ezt megteheti a csatorna regisztrációja során (a harmadik argumentum segítségével), vagy később:

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

  2. key.attach(object);

Később megkaphatja a csatolt objektumot a kulcsról:

Object object = key.attachment();

Következtetés

A csatornák választóval történő regisztrálása után a következőket tehetjük:

  • megtudja a meghatározott műveletek végrehajtására kész csatornák számát
  • blokkolja programunk végrehajtását, amíg legalább egy csatorna készen nem áll
  • kap egy kulcskészletet a kész csatornákhoz
  • és több

A második modul végén a gyakorlatban is kipróbáljuk a szelektorokat.