मेरे पास एक बुनियादी सवाल है। क्यों और कैसे चयन करने योग्य चैनल की रजिस्टर विधि कॉल अवरुद्ध करने में हो सकती है। मुझे एक परिदृश्य प्रदान करने दें।जावा थ्रेड ब्लॉक। क्या करें?
मैंने निम्नानुसार श्रेणी रजिस्टर में एक चयनकर्ता वस्तु बनाई है।
private static Selector selector = Selector.open();
मेरे पास चयनकर्ता के साथ चैनल पंजीकृत करने के लिए एक ही कक्षा (रजिस्टर) में एक विधि भी है।
public static SelectionKey registerChannel(SelectableChannel channel,
int ops) throws IOException {
channel.configureBlocking(false);
return channel.register(selector, ops);
}
और वहाँ एक और वर्ग का अनुरोध नाम है, जो विधि है जो चैनलों, प्रक्रियाओं और कॉल चैनल रजिस्टर करने के लिए विधि का अनुसरण करने से डेटा पढ़ता है।
selectonKey = Register.register(socketChannel, SelectionKey.OP_READ);
इस बिंदु पर धागा अवरुद्ध है, जो इसके लिए इंतजार कर रहा है उसके बारे में जानकारी नहीं दे रहा है। मैंने सत्यापित किया है कि चयनकर्ता खुला है। कृपया मुझे यह समझने में कुछ मदद दें कि मैं इसे कैसे हल कर सकता हूं। क्या कोई लॉक है जिसे मैं रिलीज़ कर सकता हूं।
किसी भी इनपुट की सराहना की जाएगी।
जो मैंने वर्णित किया है उसे जोड़ना। आगे के परीक्षणों से पता चला कि यदि रजिस्टर.रेस्टर विधि को उसी धागे से बुलाया जाता है, तो यह पंजीकरण करने में सक्षम होता है लेकिन उसके बाद यदि कोई अन्य थ्रेड विधि को आमंत्रित करने का प्रयास करता है, तो थ्रेड आगे नहीं बढ़ता है।
कोड नमूने के लिए +1। मैं अनुभव से यह दूसरा। अच्छी तरह से किया। – casey
यह प्रत्येक पंजीकरण के लिए 500 एमएस अनावश्यक विलंबता को जोड़ता है। इसके बजाय http://stackoverflow.com/a/2179612/448970 में दृष्टिकोण का उपयोग करें। –
@ डेविड बी। यह प्रत्येक पंजीकरण में कोई विलंबता नहीं जोड़ता है। यह चुनिंदा धागा है जो 500ms तक ब्लॉक करता है, रजिस्टर थ्रेड नहीं, और चयन थ्रेड हमेशा 'select()' में अवरुद्ध करना चाहता है। उत्तर में दावों में आप अधिकतर गलत हैं। – EJP