Dalam pelajaran ini, kita akan berkenalan dengan kelas Selector . Kelas ini berada dalam pakej java.nio.channels , jadi anda tidak perlu memuat turun atau mengkonfigurasi apa-apa untuk menggunakannya. Objek Pemilih boleh memantau satu atau lebih objek Saluran , menyemak kesediaannya untuk membaca/menulis, dsb. Dan yang paling penting, pemilih memerlukan satu aliran, bukan satu aliran bagi setiap saluran.

Kami membuat pemilih menggunakan kaedah terbuka statik :

Selector selector = Selector.open();

Selepas itu, saluran boleh didaftarkan dalam objek pemilih:

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

Parameter kedua kaedah daftar menentukan operasi mana yang akan dipantau oleh pemilih. Jika anda perlu memantau beberapa operasi sekaligus, anda boleh menggunakan bitwise ATAU:

SelectionKey.OP_READ | SelectionKey.OP_WRITE

Apabila tindakan I/O berlaku pada mana-mana saluran, pemilih memberitahu kami. Dengan cara ini anda boleh, sebagai contoh, membaca data daripada sejumlah besar sumber data.

Di sini kita perlu menyebut bahawa saluran mestilah dalam mod tidak menyekat agar ia boleh digunakan dengan pemilih:

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

Ia berikutan bahawa pemilih tidak akan berfungsi dengan FileChannel , kerana FileChannel tidak boleh ditukar kepada mod tidak menyekat ( kaedah configureBlocking diisytiharkan dalam kelas SelectableChannel , yang FileChannel tidak diwarisi).

Daripada rajah, anda boleh melihat bahawa pemilih sesuai digunakan dengan soket. Kami akan bekerjasama dengan mereka pada penghujung modul kedua.

SelectionKey

Apabila mendaftar saluran dengan pemilih, kami mendapat aSelectionKeyobjek. Objek ini mengandungi data tentang pendaftaran saluran.

Anda boleh menggunakan kekunci untuk menentukan sama ada saluran sedia untuk nilai tertentu:

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

Kunci boleh memberi anda saluran dan pemilih yang sepadan:

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

Anda boleh melampirkan sebarang objek pada kunci untuk menjejakinya pada masa hadapan. Ini boleh dilakukan sama ada semasa pendaftaran saluran (melalui hujah ketiga) atau kemudian:

  1. Kunci SelectionKey = channel.register(pemilih, SelectionKey.OP_ACCEPT, objek);

  2. key.attach(objek);

Kemudian, anda boleh mendapatkan objek yang dilampirkan daripada kekunci:

Object object = key.attachment();

Kesimpulan

Selepas mendaftarkan saluran dengan pemilih, kami boleh:

  • mengetahui bilangan saluran yang sedia untuk melaksanakan operasi tertentu
  • menyekat pelaksanaan program kami sehingga sekurang-kurangnya satu saluran siap
  • dapatkan satu set kunci untuk saluran sedia
  • dan banyak lagi

Pada akhir modul kedua, kami akan mencuba pemilih dalam amalan.