I den här lektionen kommer vi att bekanta oss med Selector -klassen. Den här klassen finns i java.nio.channels -paketet, så du behöver inte ladda ner eller konfigurera något för att använda den. Ett väljarobjekt kan övervaka ett eller flera kanalobjekt , kontrollera deras beredskap att läsa/skriva, etc. Och viktigast av allt, en väljare behöver en ström, inte en ström per kanal.

Vi skapar väljare med den statiska öppna metoden:

Selector selector = Selector.open();

Därefter kan kanaler registreras i ett väljarobjekt:

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

Den andra parametern i registermetoden bestämmer vilken operation väljaren kommer att övervaka. Om du behöver övervaka flera operationer samtidigt kan du använda bitvis ELLER:

SelectionKey.OP_READ | SelectionKey.OP_WRITE

När en I/O-åtgärd inträffar på någon av kanalerna meddelar väljaren oss. På så sätt kan du till exempel läsa data från ett stort antal datakällor.

Här måste vi nämna att en kanal måste vara i icke-blockerande läge för att den ska kunna användas med en väljare:

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

Det följer att en väljare inte kommer att fungera med en FileChannel , eftersom en FileChannel inte kan växlas till icke-blockerande läge ( configurBlocking- metoden deklareras i klassen SelectableChannel , som FileChannel inte ärver).

Från diagrammet kan du se att väljare är lämpliga att använda med uttag. Vi kommer att arbeta med dem i slutet av den andra modulen.

Selection Key

När vi registrerar en kanal med en väljare får vi enSelection Keyobjekt. Detta objekt innehåller data om kanalregistrering.

Du kan använda knappen för att avgöra om kanalen är redo för ett visst värde:

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

Nyckeln kan ge dig motsvarande kanal och väljare:

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

Du kan fästa vilket objekt som helst på en nyckel för att spåra det i framtiden. Detta kan göras antingen under kanalregistrering (via det tredje argumentet) eller senare:

  1. SelectionKey nyckel = kanal.register(väljare, SelectionKey.OP_ACCEPT, objekt);

  2. key.attach(objekt);

Senare kan du hämta det bifogade objektet från nyckeln:

Object object = key.attachment();

Slutsats

Efter att ha registrerat kanaler med en väljare kan vi:

  • ta reda på antalet kanaler som är redo att utföra specificerade operationer
  • blockera exekvering av vårt program tills minst en kanal är klar
  • få en uppsättning nycklar för färdiga kanaler
  • och mer

I slutet av den andra modulen kommer vi att pröva väljare i praktiken.