Î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:

  1. Cheie SelectionKey = channel.register(selector, SelectionKey.OP_ACCEPT, obiect);

  2. 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ă.