मैं जावा NIO का उपयोग कर एक सरल फ़ाइल सर्वर से एक का चयन धागा और कई कार्यकर्ता धागे के साथ (वास्तविक पढ़ने/लिखने के लिए) को लागू करने के साथ कर रहा हूँ जावा NIO SocketChannel.read()।multithread
कोड का मुख्य हिस्सा की तरह लग रहा है:
while (true) {
int num = selector.select();
if (num > 0) {
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
final SelectionKey key = keys.next();
keys.remove();
if (key.isValid()) {
if (key.isAcceptable()) {
accept(key);
} else if (key.isReadable()) {
performReadInWorkerThread (key);
} else if (key.isWritable()) {
performWriteInWorkerThread (key);
}
}
}
}
आप कोड का टुकड़ा, जब एक पठनीय/लिखने योग्य चैनल चयन किया जाता है से देख सकते हैं, मैं पढ़ने ऑफलोड/चयन धागे से लिखना एक कार्यकर्ता थ्रेड के लिए।
अब समस्या यह है कि जब एक पठनीय चैनल कार्यकर्ता धागे को सौंप दिया जाता है, और इसे समाप्त होने से पहले/चैनल से पढ़ना शुरू होता है, तो चयन थ्रेड फिर से लूप करता है, और selector.select()
पहले चयनित पठनीय चैनल का चयन करता है (क्योंकि अभी भी है चैनल कि है अभी तक पूरी तरह पहले से सौंपा कार्यकर्ता धागा से भस्म नहीं में इनपुट बफर), इसलिए फिर से चैनल एक और कार्यकर्ता धागा को सौंप दिया है, कई कार्यकर्ता धागे एक ही चैनल पढ़ने में जिसके परिणामस्वरूप।
मेरा मानना है कि यह एक डिजाइन समस्या है। मेरा सवाल यह है कि मैं एक ही समय में एक चैनल पढ़ने के लिए केवल एक थ्रेड सुनिश्चित कर सकता हूं?
मा जवाब आप एक सरल फ़ाइल सर्वर मैं NIO अवरुद्ध, या आईओ को अवरुद्ध का प्रयोग करेंगे चाहते हैं कि आप – Amith
मदद मिल सकती है की पढ़ा हिस्से के लिए मा देखें। आईएमएचओ चयनकर्ताओं के साथ गड़बड़ करने से यह बहुत आसान है। –