मैंने http://www.ibm.com/developerworks/ पढ़ा है java/लाइब्रेरी/j-jtp05236/index.html

मैं अपने लॉक को रद्द करने योग्य कार्य करने का निर्णय लेता हूं

try {
    lockedRecords.wait();
} catch (InterruptedException e) {
    interrupted = true;
}

लेकिन क्या इसकी आवश्यकता है

} finally {
    if (interrupted) {
        Thread.currentThread().interrupt();
    }
}

लेख कहता है कि आपको बाधित स्थिति को बनाए रखने के लिए इंटरप्ट () को कॉल करना चाहिए। मैं अभी भी बहुत धुंधला हूँ, तो क्या हुआ अगर मैं .interrupt सेट करूँ? आगे क्या होगा? इस पर थोड़ा खो गया .. कोई इनपुट?

यह मेरे कार्यक्रम में क्या मूल्य लाता है? कृपया सामान्य शब्दों में समझाएं, बहुत सराहना की: डी

0
seesee 10 अगस्त 2011, 02:58

2 जवाब

सबसे बढ़िया उत्तर

यहां जो महत्वपूर्ण है वह कोड है जो उदाहरण में नहीं लिखा गया है। उदाहरण में विधि (getNextTask) का उपयोग इसमें किया जा सकता है:

while (!Thread.interrupted()) {
   Task task = getNextTask(queue);  
   doSomething(task);
}
System.out.println("The thread was interrupted while processing tasks.");
System.out.println("...stopped processing.");

उपरोक्त while लूप हमेशा के लिए निष्पादित होता है, जब तक कि कोई उस थ्रेड को बाधित न करे जिस पर यह लूप चलता है।

यदि इंटरप्ट स्थिति को रीसेट नहीं किया जाता है जैसा कि getNextTask में किया जाता है, हालांकि, जब कोई व्यक्ति queue.take में getNextTask में थ्रेड को बाधित करने का प्रयास करता है, तो इंटरप्ट खो जाता है और बिट मैंने ऊपर लिखा कोड कभी भी लूपिंग बंद नहीं करेगा।

आईबीएम वेबपेज पर उदाहरण का पूरा बिंदु यह है कि जब आप किसी बाधा को निगलते हैं तो आपको बहुत सावधान रहना चाहिए क्योंकि यह गलती से थ्रेड को बाधित करना असंभव बना सकता है।

2
toto2 10 अगस्त 2011, 03:45
Oic लेकिन अगर एप्लिकेशन में कोई कोड नहीं है जो रुकावट पर रुकता है, तो हमें इसके बारे में चिंतित नहीं होना चाहिए?
 – 
seesee
10 अगस्त 2011, 21:00
खैर हाँ... लेकिन किसी भी तरह से इंटरप्ट सेट करना बेहतर है क्योंकि आप किसी बिंदु पर किसी और चीज़ के लिए अपने कोड का पुन: उपयोग कर सकते हैं और यह पता लगाना बहुत मुश्किल होगा कि कुछ थ्रेड को बाधित क्यों नहीं किया जा सकता है।
 – 
toto2
11 अगस्त 2011, 00:42

बस InterruptedException को निगलना ठीक है, जब तक आप जानते हैं कि आपका कार्य पूरा होने के बाद वर्तमान थ्रेड समाप्त हो जाएगा और वापस आ जाएगा।

कुछ थ्रेड पूल का उपयोग करते समय समस्याएँ उत्पन्न हो सकती हैं, जैसे ExecutorService, जहाँ आमतौर पर कार्य पूरा होने के बाद भी थ्रेड चलते रहते हैं, अगले कार्य के आने की प्रतीक्षा करते हैं। इस मामले में पूल किए गए थ्रेड को सूचित किया जाना चाहिए कि इसे बाधित किया गया था ताकि यह इस स्थिति में जो कुछ भी उपयुक्त हो वह कर सके, उदा। एक साफ शटडाउन करें और बाहर निकलें।

इस प्रकार, यह अच्छा अभ्यास है और यह सुनिश्चित करने के लिए अधिक सुरक्षित है कि आप अपनी दिनचर्या से लौटने से पहले बाधित स्थिति को बहाल कर लें।

0
JimmyB 27 अक्टूबर 2011, 18:18