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:
-
SelectionKey kulcs = channel.register(selector, SelectionKey.OP_ACCEPT, object);
-
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.
GO TO FULL VERSION