इस पाठ में, हम चयनकर्ता वर्ग से परिचित होंगे । यह वर्ग java.nio.channels पैकेज में है, इसलिए इसका उपयोग करने के लिए आपको कुछ भी डाउनलोड या कॉन्फ़िगर करने की आवश्यकता नहीं है। एक चयनकर्ता वस्तु एक या अधिक चैनल वस्तुओं की निगरानी कर सकती है, पढ़ने/लिखने के लिए उनकी तत्परता की जांच कर सकती है, आदि। और सबसे महत्वपूर्ण बात यह है कि एक चयनकर्ता को प्रति चैनल एक स्ट्रीम नहीं, बल्कि एक स्ट्रीम की आवश्यकता होती है।

हम स्टैटिक ओपन मेथड का उपयोग करके चयनकर्ता बनाते हैं:


Selector selector = Selector.open();

उसके बाद, चयनकर्ता वस्तु में चैनल पंजीकृत किए जा सकते हैं:


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

रजिस्टर विधि का दूसरा पैरामीटर निर्धारित करता है कि चयनकर्ता किस ऑपरेशन की निगरानी करेगा। यदि आपको एक साथ कई ऑपरेशनों की निगरानी करने की आवश्यकता है, तो आप बिटवाइज़ का उपयोग कर सकते हैं या:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

जब किसी चैनल पर I/O क्रिया होती है, तो चयनकर्ता हमें सूचित करता है। उदाहरण के लिए, इस तरह आप बड़ी संख्या में डेटा स्रोतों से डेटा पढ़ सकते हैं।

यहां हमें यह उल्लेख करने की आवश्यकता है कि चयनकर्ता के साथ इसका उपयोग करने के लिए एक चैनल को गैर-अवरुद्ध मोड में होना चाहिए:


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

यह इस प्रकार है कि एक चयनकर्ता FileChannel के साथ काम नहीं करेगा , क्योंकि एक FileChannel को गैर-अवरुद्ध मोड में स्विच नहीं किया जा सकता है ( ConfigureBlocking विधि SelectableChannel क्लास में घोषित की गई है , जो FileChannel विरासत में नहीं है)।

आरेख से, आप देख सकते हैं कि चयनकर्ता सॉकेट के साथ उपयोग करने के लिए उपयुक्त हैं। हम दूसरे मॉड्यूल के अंत में उनके साथ काम करेंगे।

चयनकुंजी

एक चयनकर्ता के साथ एक चैनल पंजीकृत करते समय, हमें एक मिलता हैचयनकुंजीवस्तु। इस वस्तु में चैनल पंजीकरण के बारे में डेटा है।

आप यह निर्धारित करने के लिए कुंजी का उपयोग कर सकते हैं कि क्या चैनल एक निश्चित मान के लिए तैयार है:


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

कुंजी आपको संबंधित चैनल और चयनकर्ता दे सकती है:


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

भविष्य में इसे ट्रैक करने के लिए आप किसी ऑब्जेक्ट को कुंजी से जोड़ सकते हैं। यह या तो चैनल पंजीकरण के दौरान (तीसरे तर्क के माध्यम से) या बाद में किया जा सकता है:

  1. SelectionKey key = channel.register (चयनकर्ता, SelectionKey.OP_ACCEPT, ऑब्जेक्ट);

  2. की.अटैच (ऑब्जेक्ट);

बाद में, आप संलग्न वस्तु को कुंजी से प्राप्त कर सकते हैं:


Object object = key.attachment();

निष्कर्ष

एक चयनकर्ता के साथ चैनल पंजीकृत करने के बाद, हम यह कर सकते हैं:

  • निर्दिष्ट संचालन करने के लिए तैयार चैनलों की संख्या का पता लगाएं
  • कम से कम एक चैनल तैयार होने तक हमारे कार्यक्रम के निष्पादन को रोकें
  • तैयार चैनलों के लिए चाबियों का एक सेट प्राप्त करें
  • और अधिक

दूसरे मॉड्यूल के अंत में, हम अभ्यास में चयनकर्ताओं को आजमाएंगे।