चुनते समय नए चैनल को सही तरीके से पंजीकृत कैसे करें मेरे पास Thread
एक निजी Selector
और सार्वजनिक register(SelectableChannel channel, ...)
विधि है जो अन्य धागे चयनकर्ता को चैनल पंजीकृत करने की अनुमति देता है।एनआईओ चयनकर्ता:
के रूप में के दौरान here, चैनल का register()
ब्लॉक जवाब चयनकर्ता के select()
/select(long timeout)
तो हम चयनकर्ता wakeup()
की जरूरत है।
मेरा धागा अनिश्चित काल तक चुनता है (जब तक कि यह बाधित न हो) और यह वास्तव में चैनल के register()
कहने से पहले अगले चयन में शामिल होने का प्रबंधन करता है। तो मैंने सोचा कि register()
पहले होता है यह सुनिश्चित करने के लिए कि मैं synchronized
ब्लॉक के साथ एक साधारण लॉक का उपयोग करता हूं।
कोड: इससे पहले कि धागा अगले चयन पाश के साथ जारी है (अप्रासंगिक कोड पठनीयता के लिए हटाया)
public class SelectorThread extends Thread {
...
public void register(SelectableChannel channel, Attachment attachment) throws IOException {
channel.configureBlocking(false);
synchronized (this) { // LOCKING OCCURS HERE
selector.wakeup();
channel.register(selector,
SelectionKey.OP_READ,
attachment);
}
}
@Override
public void run() {
int ready;
Set<SelectionKey> readyKeys;
while (!isInterrupted()) {
synchronized (this) {} // LOCKING OCCURS HERE
try {
ready = selector.select(5000);
} catch (IOException e) {
e.printStackTrace();
continue;
}
if (ready == 0) {
continue;
}
readyKeys = selector.selectedKeys();
for (SelectionKey key : readyKeys) {
readyKeys.remove(key);
if (!key.isValid()) {
continue;
}
if (key.isReadable()) {
...
}
}
}
}
}
यह सरल ताला अनुमति देता है register()
होने की। जहां तक मैंने परीक्षण किया, यह माना जाता है कि यह काम करता है।
प्रश्न: क्या यह करने के लिए "अच्छा" तरीका है या क्या कोई गंभीर डाउनसाइड्स है? पंजीकरण के लिए चैनल स्टोर करने के लिए सूची या कतार (जैसा कि here सुझाया गया है) का उपयोग करना बेहतर होगा, या इसके बजाय this जैसे अधिक परिष्कृत लॉक का उपयोग करना बेहतर होगा? उस के पेशेवर/विपक्ष क्या होंगे? या क्या कोई "बेहतर" तरीके हैं?
चुनिंदा() को चुनने के दौरान चयनकर्ता के साथ चैनल पंजीकृत करते समय [जावा थ्रेड ब्लॉक का संभावित डुप्लिकेट) कहा जाता है। क्या करना है?] (Https://stackoverflow.com/questions/1057224/java-thread-blocks-while-registering-channel-with-selector-while-select-is-cal) – Flow