Sa araling ito, makikilala natin ang klase ng Selector . Ang klase na ito ay nasa java.nio.channels package, kaya hindi mo kailangang mag-download o mag-configure ng kahit ano para magamit ito. Maaaring subaybayan ng isang bagay na Selector ang isa o higit pang mga bagay sa Channel , suriin ang kanilang kahandaang magbasa/magsulat, atbp. At higit sa lahat, kailangan ng isang tagapili ng isang stream, hindi isang stream bawat channel.

Lumilikha kami ng mga tagapili gamit ang static na bukas na paraan:

Selector selector = Selector.open();

Pagkatapos nito, maaaring mairehistro ang mga channel sa isang bagay na tagapili:

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

Tinutukoy ng pangalawang parameter ng paraan ng pagrehistro kung aling operasyon ang susubaybayan ng tagapili. Kung kailangan mong subaybayan ang ilang mga operasyon nang sabay-sabay, maaari mong gamitin ang bitwise O:

SelectionKey.OP_READ | SelectionKey.OP_WRITE

Kapag may nangyaring I/O action sa alinman sa mga channel, aabisuhan kami ng selector. Sa ganitong paraan maaari mong, halimbawa, basahin ang data mula sa isang malaking bilang ng mga pinagmumulan ng data.

Dito kailangan nating banggitin na ang isang channel ay dapat nasa non-blocking mode upang ito ay magamit kasama ng isang tagapili:

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

Kasunod nito na ang isang selector ay hindi gagana sa isang FileChannel , dahil ang isang FileChannel ay hindi maaaring ilipat sa non-blocking mode (ang configureBlocking na paraan ay idineklara sa SelectableChannel class, na hindi namana ng FileChannel ).

Mula sa diagram, makikita mo na ang mga tagapili ay angkop na gamitin sa mga socket. Makikipagtulungan tayo sa kanila sa dulo ng ikalawang modyul.

SelectionKey

Kapag nagrerehistro ng channel na may tagapili, nakakakuha kami ng aSelectionKeybagay. Ang bagay na ito ay naglalaman ng data tungkol sa pagpaparehistro ng channel.

Maaari mong gamitin ang susi upang matukoy kung handa na ang channel para sa isang partikular na halaga:

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

Ang key ay maaaring magbigay sa iyo ng kaukulang channel at selector:

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

Maaari mong ilakip ang anumang bagay sa isang susi upang masubaybayan ito sa hinaharap. Magagawa ito alinman sa panahon ng pagpaparehistro ng channel (sa pamamagitan ng ikatlong argumento) o mas bago:

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

  2. key.attach(object);

Sa ibang pagkakataon, maaari mong makuha ang naka-attach na bagay mula sa susi:

Object object = key.attachment();

Konklusyon

Pagkatapos magrehistro ng mga channel sa isang tagapili, maaari naming:

  • alamin ang bilang ng mga channel na handang magsagawa ng mga tinukoy na operasyon
  • harangan ang pagpapatupad ng aming programa hanggang sa maging handa ang kahit isang channel
  • kumuha ng set ng mga key para sa mga handa na channel
  • at iba pa

Sa pagtatapos ng ikalawang modyul, susubukan natin ang mga tagapili sa pagsasanay.