(1)
बेस्ट समाधान एक टाइमआउट के साथ अपने डेटा भेजने के लिए है। जैसे
try {
mySendingDataLibraryApi.sendData(data, timeout /*, timeUnit */);
// some new APIs enable also to configure the time unit of the required timeout.
// Older APIs typically just use milliseconds.
} catch (TimeoutException e) {
doCleanup(); // your cleanup method.
}
(2)
कुछ दिखना चाहिए यदि यह लागू नहीं है के बाद से एपीआई का उपयोग कर रहे इस तरह के विन्यास का खुलासा नहीं करता है, दूसरा सबसे अच्छा समाधान एक व्यवधान कारक एपीआई का उपयोग किया जाएगा sendData
विधि और निष्पादन थ्रेड को बाधित करें। यह इस तथ्य पर निर्भर करता है कि इस तरह के एक इंटरप्टिबल एपीआई प्रदान की जाती है।
class MySendingDataRunnable implements Runnable {
@Override
public void run() {
try {
mySendingDataLibraryApi.sendDataInterruptibly(data);
} catch (InterruptedException e) {
doCleanup(); // your cleanup method.
// here either re-throw InterruptedExecption
// or restore the interrupted state with Thread.currentThread().interrupt();
}
}
}
: मैं इस तरह के एक विधि के अस्तित्व पर ज्यादा भरोसा नहीं होता है, तो एक समय विधि एपीआई द्वारा प्रदान नहीं की है ... वैसे भी, थ्रेड में कोड उस कार्य को निष्पादित करता दिखाई देगा फोन करने वाले में कोड धागा, एक ExecutorService और Future उदाहरण, अपना Future<?> submit(Runnable task)
विधि द्वारा वापस का उपयोग करना चाहिए आदेश mayInterruptIfRunning
तर्क true
करने के लिए सेट के साथ वांछित समय प्रतीक्षा करें और कार्य को रद्द करने के लिए:
final ExecutorService executor = Executors.newSingleThreadExecutor();
final Future<?> future = executor.submit(new MySendingDataRunnable());
try {
final Object noResult = future.get(60, TimeUnit.SECONDS); // no result for Runnable
} catch (InterruptedException e) {
// here again either re-throw or restore interupted state
} catch (ExecutionException e) {
// some applicative exception has occurred and should be handled
} catch (TimeoutException e) {
future.cancel(true); // *** here you actually cancel the task after time is out
}
(3)
यदि आपके द्वारा उपयोग की जाने वाली एपीआई इनमें से किसी भी सुविधा (समय/इंटरप्टिबल विधियों) प्रदान नहीं करती है, तो आपको अपनी रचनात्मकता का उपयोग करना होगा! आपके संसाधन को अवरुद्ध करने की यह एक पंक्ति को कुछ संसाधन पर अवरुद्ध करनी चाहिए। इस संसाधन के लिए पहुंचने का प्रयास करें और इसे बंद कर दें या इससे डिस्कनेक्ट करें, जिससे कार्य को समाप्त कर दिया जा सके।एक सामान्य उदाहरण नेटवर्क कनेक्शन बंद कर रहा है।
नोट: ऊपर समाधान केवल वास्तव में कार्य रद्द किए जाने और आगे कार्यों के लिए धागा मुक्त कराने का एक तरीका प्रदान करते हैं। धागा अभी भी जिंदा हो सकता है। थ्रेड को मारना आम तौर पर ऐसा नहीं होता है जब कोई कार्य पूरा हो जाता है (या उस मामले में विफल रहता है)। यह स्वीकार्य है जब आपने विशिष्ट कार्य (ओं) के लिए कुछ धागे बनाए हैं जिन्हें कभी भी निष्पादित नहीं किया जाना चाहिए। ऐसे मामलों में आप उपर्युक्त ExecutorService
का उपयोग करते हैं और इसकी shutdownNow()
विधि का आह्वान करते हैं। और यहां तक कि shutdownNow()
केवल सबसे अच्छा प्रयास करता है और आम तौर पर वास्तविक कार्य पर निर्भर करता है व्यवधान कारक होने के लिए ...
Here's a detailed article (कुछ हद तक पुराने लेकिन फिर भी)।
क्या इस धागे में शीर्ष स्तर का लूप है? क्या कोड का एक टुकड़ा है जो थ्रेड हो जाता है भले ही थ्रेड फंस जाए? क्या आप भविष्यवाणी कर सकते हैं कि काम शुरू होने से पहले कितनी बार थ्रेड लूप/रिकर्स होगा? –
आदर्श रूप से, आपके पास कुछ झंडा होना चाहिए जो आपका थ्रेड समय-समय पर जांच करता है। यदि ध्वज सेट किया गया है, तो आपके धागे को इसके कार्य के व्यवस्थित शटडाउन का संचालन करना चाहिए। – Aurand
कोई लूप या कुछ भी नहीं है। धागा डेटा भेजता है लेकिन यदि डेटा भेजने के लिए बहुत लंबा समय लगता है तो मैं इसे बंद करना चाहता हूं। अगर यह कोड की एक पंक्ति पर फंस गया है तो मैं समय-समय पर जांच कैसे कर सकता हूं? – user760220