Bu dersimizde Selector sınıfı ile tanışacağız . Bu sınıf java.nio.channels paketindedir , dolayısıyla onu kullanmak için herhangi bir şey indirmeniz veya yapılandırmanız gerekmez. Bir Selector nesnesi, bir veya daha fazla Channel nesnesini izleyebilir , okumaya/yazmaya hazır olup olmadıklarını kontrol edebilir, vb.

Statik açık yöntemini kullanarak seçiciler oluşturuyoruz :


Selector selector = Selector.open();

Bundan sonra, kanallar bir seçici nesneye kaydedilebilir:


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

Kayıt yönteminin ikinci parametresi, seçicinin hangi işlemi izleyeceğini belirler. Birden fazla işlemi aynı anda izlemeniz gerekiyorsa, bitsel VEYA'yı kullanabilirsiniz:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

Kanallardan herhangi birinde bir G/Ç eylemi gerçekleştiğinde, seçici bizi bilgilendirir. Bu şekilde, örneğin çok sayıda veri kaynağından veri okuyabilirsiniz.

Burada bir kanalın seçici ile kullanılabilmesi için bloke olmayan modda olması gerektiğini belirtmemiz gerekir:


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

Bir seçici, bir FileChannel ile çalışmaz , çünkü bir FileChannel engellemesiz moda geçirilemez ( configureBlocking yöntemi , FileChannel'in devralmadığı SelectableChannel sınıfında bildirilir ).

Diyagramdan selektörlerin prizlerle kullanıma uygun olduğunu görebilirsiniz. İkinci modülün sonunda onlarla birlikte çalışacağız.

Seçim Anahtarı

Seçicili bir kanalı kaydederken,Seçim Anahtarınesne. Bu nesne, kanal kaydıyla ilgili verileri içerir.

Kanalın belirli bir değere hazır olup olmadığını belirlemek için tuşunu kullanabilirsiniz:


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

tuşu size ilgili kanalı ve seçiciyi verebilir:


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

Gelecekte izlemek için bir anahtara herhangi bir nesne ekleyebilirsiniz. Bu, kanal kaydı sırasında (üçüncü argüman aracılığıyla) veya daha sonra yapılabilir:

  1. SelectionKey tuşu = channel.register(seçici, SelectionKey.OP_ACCEPT, nesne);

  2. key.attach(nesne);

Daha sonra ekli nesneyi anahtardan alabilirsiniz:


Object object = key.attachment();

Çözüm

Kanalları bir seçici ile kaydettikten sonra şunları yapabiliriz:

  • belirtilen işlemleri gerçekleştirmeye hazır kanal sayısını öğrenin
  • en az bir kanal hazır olana kadar programımızın yürütülmesini engelle
  • hazır kanallar için bir dizi anahtar edinin
  • ve dahası

İkinci modülün sonunda seçicileri uygulamalı olarak deneyeceğiz.