Dalam pelajaran ini, kita akan berkenalan dengan kelas Selector . Kelas ini ada dalam paket java.nio.channels , jadi Anda tidak perlu mengunduh atau mengonfigurasi apa pun untuk menggunakannya. Objek Selector dapat memantau satu atau lebih objek Channel , memeriksa kesiapannya untuk membaca/menulis, dll. Dan yang paling penting, pemilih memerlukan satu aliran, bukan satu aliran per saluran.

Kami membuat pemilih menggunakan metode terbuka statis :


Selector selector = Selector.open();

Setelah itu, saluran dapat didaftarkan di objek pemilih:


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

Parameter kedua dari metode register menentukan operasi mana yang akan dipantau oleh pemilih. Jika Anda perlu memantau beberapa operasi sekaligus, Anda dapat menggunakan bitwise ATAU:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

Saat tindakan I/O terjadi di salah satu saluran, pemilih memberi tahu kami. Dengan cara ini Anda dapat, misalnya, membaca data dari sejumlah besar sumber data.

Di sini kami perlu menyebutkan bahwa saluran harus dalam mode non-pemblokiran agar dapat 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);

Oleh karena itu pemilih tidak akan bekerja dengan FileChannel , karena FileChannel tidak dapat dialihkan ke mode non-pemblokiran ( metode configureBlocking dideklarasikan dalam kelas SelectableChannel , yang tidak diwarisi oleh FileChannel ).

Dari diagram, Anda dapat melihat bahwa pemilih cocok digunakan dengan soket. Kami akan bekerja dengan mereka di akhir modul kedua.

Kunci Seleksi

Saat mendaftarkan saluran dengan pemilih, kami mendapatkan aKunci Seleksiobyek. Objek ini berisi data tentang pendaftaran saluran.

Anda dapat menggunakan kunci untuk menentukan apakah saluran siap untuk nilai tertentu:


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

Kuncinya dapat memberi Anda saluran dan pemilih yang sesuai:


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

Anda dapat melampirkan objek apa pun ke kunci untuk melacaknya di masa mendatang. Ini dapat dilakukan selama pendaftaran saluran (melalui argumen ketiga) atau setelahnya:

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

  2. kunci.lampirkan(objek);

Nanti, Anda bisa mendapatkan objek terlampir dari kunci:


Object object = key.attachment();

Kesimpulan

Setelah mendaftarkan saluran dengan pemilih, kita dapat:

  • cari tahu jumlah saluran yang siap untuk melakukan operasi yang ditentukan
  • blokir eksekusi program kami hingga setidaknya satu saluran siap
  • dapatkan satu set kunci untuk saluran siap pakai
  • dan banyak lagi

Di akhir modul kedua, kami akan mencoba penyeleksi dalam praktek.