În această lecție, ne vom familiariza cu clasa Selector . Această clasă se află în pachetul java.nio.channels , așa că nu trebuie să descărcați sau să configurați nimic pentru ao utiliza. Un obiect Selector poate monitoriza unul sau mai multe obiecte Channel , verifica disponibilitatea acestora de a citi/scriere, etc. Și, cel mai important, un selector are nevoie de un flux, nu de un flux pe canal.
Creăm selectori folosind metoda deschisă statică :
Selector selector = Selector.open();
După aceea, canalele pot fi înregistrate într-un obiect selector:
SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);
Al doilea parametru al metodei de înregistrare determină ce operație va monitoriza selectorul. Dacă trebuie să monitorizați mai multe operațiuni simultan, puteți utiliza SAU pe biți:
SelectionKey.OP_READ | SelectionKey.OP_WRITE
Când are loc o acțiune I/O pe oricare dintre canale, selectorul ne anunță. În acest fel, puteți, de exemplu, să citiți date dintr-un număr mare de surse de date.
Aici trebuie să menționăm că un canal trebuie să fie în modul neblocant pentru a putea fi utilizat cu un selector:
channel1.configureBlocking(false);
channel2.configureBlocking(false);
SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);
Rezultă că un selector nu va funcționa cu un FileChannel , deoarece un FileChannel nu poate fi comutat în modul non-blocking ( metoda configureBlocking este declarată în clasa SelectableChannel , pe care FileChannel nu o moștenește).

Din diagramă, puteți vedea că selectoarele sunt potrivite pentru a fi utilizate cu prize. Vom lucra cu ei la sfârșitul celui de-al doilea modul.
Tasta de selecție
Când înregistrăm un canal cu un selector, obținem unTasta de selecțieobiect. Acest obiect conține date despre înregistrarea canalului.
Puteți folosi tasta pentru a determina dacă canalul este pregătit pentru o anumită valoare:
key.isReadable()
key.isAcceptable()
key.isConnectable()
key.isWritable()
Tasta vă poate oferi canalul și selectorul corespunzător:
Channel channel = key.channel();
Selector selector = key.selector();
Puteți atașa orice obiect la o cheie pentru a o urmări în viitor. Acest lucru se poate face fie în timpul înregistrării canalului (prin al treilea argument), fie mai târziu:
-
Cheie SelectionKey = channel.register(selector, SelectionKey.OP_ACCEPT, obiect);
-
cheie.atașa(obiect);
Mai târziu, puteți obține obiectul atașat de la cheie:
Object object = key.attachment();
Concluzie
După înregistrarea canalelor cu un selector, putem:
- aflați numărul de canale pregătite pentru a efectua operațiuni specificate
- blocați execuția programului nostru până când cel puțin un canal este gata
- obțineți un set de chei pentru canalele pregătite
- și altele
La sfârșitul celui de-al doilea modul, vom încerca selectoare în practică.
GO TO FULL VERSION