संपादित:
कुछ वापस करने के बाद आगे और पीछे, ऐसा लगता है जैसे आप अपने आईओ दिनचर्या बाधित करने के लिए सक्षम होना चाहते हैं। यह कुछ एनआईओ InterrutibleChannel
कक्षाओं के लिए एक अच्छी नौकरी की तरह लगता है। उदाहरण के लिए, निम्नलिखित BufferedReader
से पढ़ना बाधित है और InterruptedIOException
फेंक देगा। more examples of the NIO code के लिए यहां देखें।
BufferedReader in = new BufferedReader(new InputStreamReader(
Channels.newInputStream((new FileInputStream(
new File(...))).getChannel())));
उसके बाद, आप future.cancel()
जो अपने धागा बाधित हो जाएंगी कॉल और आईओ एक InterruptedIOException
फेंकने के लिए हो सकता है। यदि ऐसा होता है, तो आप IOException
को पकड़ सकते हैं और इसे call()
विधि से बाहर निकलने दें।
आप Future
कि call()
विधि बाधित किया गया था तो मैं फेंकने लगता है कि InterruptedException
ठीक है वापस करने के लिए पास करना चाहते हैं। एक और विकल्प केवल return null;
या आपके call()
विधि से कुछ अन्य मार्कर ऑब्जेक्ट होगा। अगर आम तौर पर धागा बाधित होता है तो मैं आमतौर पर ऐसा करता हूं।
एक बात याद रखना महत्वपूर्ण है कि अगर call()
फेंकता InterruptedException
, जब आप एक future.get()
कर फेंक होगा एक ExecutionException
और कारण कि अपवाद का एक InterruptedException
होने जा रहा है है। भ्रमित न हों कि future.get()
get(long timeout, TimeUnit unit)
बार बाहर होने पर InterruptedException
भी फेंक सकता है।
try {
result = future.get();
} catch (ExecutionException e) {
if (e.getCause() instanceof InterruptedException) {
// call() method was interrupted
}
} catch (InterruptedException e) {
// get was interrupted
}
अगर, हालांकि, future.cancel(true)
तो कहा जाता था future.get()
एक CancellationException
बजाय फेंक देते हैं।
'इंटरप्टेड एक्सेप्शन' को समझाने के लिए एक सही स्रोत है [यहां] (http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html)। –
मैंने इसे पहले पढ़ा था, लेकिन इसमें कॉल करने योग्य का उल्लेख नहीं है। हालांकि, बहुत अच्छा लेख है। –