टीएल; डॉ; Future.cancel(false)
केवल उन कार्यों को शुरू करने से बचने के लिए उपयोगी है जो पहले ही शुरू नहीं हुए थे।
समवर्ती और रद्दीकरण के संबंध में समझने के लिए दो महत्वपूर्ण बातें हैं।
पहला यह है कि जावा रद्दीकरण में पूरी तरह से सहकारी है। जावा अवरोधन विधियों को अवरुद्ध करने के अनुरोध को अवरुद्ध करता है, अवरोधक निष्पादन को फेंक देता है और थ्रेड पर ध्वज सेट करके। कार्य कार्यान्वयन रद्दीकरण अनुरोध को ध्यान में रखते हुए और खुद को रद्द करने के लिए ज़िम्मेदार है। ब्रायन गोएट्ज़ ने Dealing with InterruptedException पर अपनी पोस्ट में बाधा डाली। सभी कार्य कार्यान्वयन सही ढंग से बाधा को संभालने में सक्षम नहीं होंगे।
दूसरी बात यह इंगित करने के लिए है कि भविष्य वस्तु किसी कार्य को भविष्य में निष्पादित करने के परिणामों के लिए प्लेसहोल्डर है। यदि आपके पास चलने वाले धागे के बहुत सारे नहीं हैं तो यह संभव है कि कार्य तुरंत निष्पादित हो जाए लेकिन यह भी संभव है कि सभी धागे पहले से ही उपयोग किए जा रहे हैं और कार्य को प्रतीक्षा करनी है। सिर्फ इसलिए कि आपके पास भविष्य की वस्तु का संदर्भ है जिसका अर्थ यह नहीं है कि संबंधित कार्य वास्तव में चलना शुरू हो गया है। आरक्षण की तरह इसकी तरह।
आप एक भविष्य वस्तु है, लेकिन कार्य निम्न राज्यों में से एक में हो सकता है:
- प्रतीक्षा कर रहा है। उदाहरण के लिए यह प्रोसेसर समय की प्रतीक्षा में अन्य कार्यों की कतार में हो सकता है।
- रनिंग।
- पूर्ण।
अपने कार्य का पहला राज्य में है, तो "वेटिंग" तो दोनों Future.cancel(true)
और Future.cancel(false)
रद्द भविष्य का प्रतीक होगा। कार्य निष्पादित करने के कार्यों के कतार में बनी हुई है, लेकिन जब निष्पादक कार्य को प्राप्त करता है तो यह रद्द ध्वज को नोटिस करता है और इसे छोड़ देता है।
यदि आपका कार्य तीसरे राज्य में है Future.cancel(true)
और Future.cancel(false)
दोनों की तुलना में "पूर्ण" में झूठी वापसी और कुछ भी नहीं करें। जो समझ में आता है क्योंकि वे पहले ही कर चुके हैं और उन्हें पूर्ववत करने का कोई तरीका नहीं है।
mayInterruptIfRunning
ध्वज केवल तभी महत्वपूर्ण है जब आपका कार्य दूसरे राज्य "रनिंग" में हो।
यदि आपका कार्य चल रहा है और mayInterruptIfRunning
गलत है तो निष्पादक कुछ भी नहीं करता है और कार्य को पूरा करने की अनुमति देता है।
यदि आपका कार्य चल रहा है और mayInterruptIfRunning
सत्य है तो निष्पादक कार्य को बाधित करेगा। लेकिन सहकारी रद्दीकरण के बारे में थोड़ा याद रखें - कार्य को रोकने में बाधा के लिए रद्दीकरण को संभालने के लिए लागू किया जाना है।
सारांश:
- भविष्य एक लंबी चलने वाली कार्य है कि रुकावट को संभालने के लिए लागू किया गया है करने के लिए जाना जाता है का प्रतिनिधित्व करता है:
Future.cancel(true)
उचित है।
Future.cancel(false)
सही होगा:
- कार्य कार्यान्वयन बाधित किया जा रहा संभाल नहीं कर सकते।
- यह अज्ञात है कि कार्य कार्यान्वयन रद्दीकरण का समर्थन करता है।
- आप पहले से ही शुरू किए गए कार्यों को पूरा करने के लिए प्रतीक्षा कर रहे हैं।
आपका पहला विवरण बिल्कुल सही नहीं है। यदि कार्य चल रहा है (गलत) से चल रहा है या पूरा हो गया है तो इसे रद्द के रूप में चिह्नित नहीं किया गया है। – Ryan