2010-07-17 5 views
11

पैरामीटर Future.cancel() पर false को किस स्थिति में पास करना होगा?Future.cancel (false) के लिए केस का उपयोग करें?

अगर मैं सही ढंग से समझ, अगर आप false गुजरती हैं और कार्य को रद्द कर दिया है, लेकिन धागा है नहीं बाधित, परिणाम (या ExecutionException) सुलभ कभी नहीं होगा क्योंकि कार्य अभी भी चिह्नित है (यानी isCancelled() रिटर्न true रद्द के रूप में और get()CancellationException फेंकता)

अन्य संभावित स्थितियों हैं:।

  • Runnable या Callable कार्यान्वयन घ ओ इ एस बीच में आता है के लिए जाँच नहीं और यहां तक ​​कि यदि आप इसमें बाधा है पूरा होने तक चलेगा
  • कार्य पहले ही पूरा हो इससे पहले कि आप cancel() कहा जाता है (यहाँ बाधा कोई फर्क नहीं पड़ता)
  • कार्य करने की जरूरत है (फिर से बाधा कोई फर्क नहीं पड़ता) इससे पहले कि कुछ निकलता है (एक अच्छी तरह से लिखित कार्यान्वयन try ... finally का उपयोग करेगा।)
  • कार्य तुरंत समाप्त नहीं हो सकता है और इंटरप्ट्स से प्रभावित होने वाले संचालन को जारी रखना जारी रखना चाहिए, उदाहरण के लिए अवरुद्ध I/O (इस मामले में आप शायद cancel बिल्कुल नहीं बुलाना चाहिए)

तो जब/क्यों आप इसे बाधित किए बिना एक कार्य को रद्द होगा?

उत्तर

6

यदि आप कार्य के निष्पादन में बाधा डालने से डरते हैं तो चीजें खराब स्थिति में छोड़ सकती हैं, और आप बस इसे रद्द के रूप में चिह्नित करना चाहते हैं ताकि Future के उपयोगकर्ताओं को इसके बारे में पता चलेगा (उदाहरण के लिए उन्हें अनुरोध किए गए आंकड़ों को जानना चाहिए समय पर प्रदर्शन नहीं किया)।

लेखन थ्रेडेड कोड जो इंटरप्ट्स को सही तरीके से संभालता है, वह बिल्कुल छोटा नहीं है, और इसलिए कोई भी इससे बचने के लिए पसंद कर सकता है।

कुछ जानकारी महान पुस्तक Concurrent Programming in Java (पुरुष जो मूल रूप से java.util.concurrent लिखा द्वारा) में here, here और निश्चित रूप से पाया जा सकता है।

+0

आपका पहला विवरण बिल्कुल सही नहीं है। यदि कार्य चल रहा है (गलत) से चल रहा है या पूरा हो गया है तो इसे रद्द के रूप में चिह्नित नहीं किया गया है। – Ryan

7

टीएल; डॉ; Future.cancel(false) केवल उन कार्यों को शुरू करने से बचने के लिए उपयोगी है जो पहले ही शुरू नहीं हुए थे।

समवर्ती और रद्दीकरण के संबंध में समझने के लिए दो महत्वपूर्ण बातें हैं।

पहला यह है कि जावा रद्दीकरण में पूरी तरह से सहकारी है। जावा अवरोधन विधियों को अवरुद्ध करने के अनुरोध को अवरुद्ध करता है, अवरोधक निष्पादन को फेंक देता है और थ्रेड पर ध्वज सेट करके। कार्य कार्यान्वयन रद्दीकरण अनुरोध को ध्यान में रखते हुए और खुद को रद्द करने के लिए ज़िम्मेदार है। ब्रायन गोएट्ज़ ने Dealing with InterruptedException पर अपनी पोस्ट में बाधा डाली। सभी कार्य कार्यान्वयन सही ढंग से बाधा को संभालने में सक्षम नहीं होंगे।

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

आप एक भविष्य वस्तु है, लेकिन कार्य निम्न राज्यों में से एक में हो सकता है:

  1. प्रतीक्षा कर रहा है। उदाहरण के लिए यह प्रोसेसर समय की प्रतीक्षा में अन्य कार्यों की कतार में हो सकता है।
  2. रनिंग।
  3. पूर्ण।

अपने कार्य का पहला राज्य में है, तो "वेटिंग" तो दोनों Future.cancel(true) और Future.cancel(false) रद्द भविष्य का प्रतीक होगा। कार्य निष्पादित करने के कार्यों के कतार में बनी हुई है, लेकिन जब निष्पादक कार्य को प्राप्त करता है तो यह रद्द ध्वज को नोटिस करता है और इसे छोड़ देता है।

यदि आपका कार्य तीसरे राज्य में है Future.cancel(true) और Future.cancel(false) दोनों की तुलना में "पूर्ण" में झूठी वापसी और कुछ भी नहीं करें। जो समझ में आता है क्योंकि वे पहले ही कर चुके हैं और उन्हें पूर्ववत करने का कोई तरीका नहीं है।

mayInterruptIfRunning ध्वज केवल तभी महत्वपूर्ण है जब आपका कार्य दूसरे राज्य "रनिंग" में हो।

यदि आपका कार्य चल रहा है और mayInterruptIfRunning गलत है तो निष्पादक कुछ भी नहीं करता है और कार्य को पूरा करने की अनुमति देता है।

यदि आपका कार्य चल रहा है और mayInterruptIfRunning सत्य है तो निष्पादक कार्य को बाधित करेगा। लेकिन सहकारी रद्दीकरण के बारे में थोड़ा याद रखें - कार्य को रोकने में बाधा के लिए रद्दीकरण को संभालने के लिए लागू किया जाना है।

सारांश:

  1. भविष्य एक लंबी चलने वाली कार्य है कि रुकावट को संभालने के लिए लागू किया गया है करने के लिए जाना जाता है का प्रतिनिधित्व करता है:

    Future.cancel(true) उचित है।

Future.cancel(false) सही होगा:

  1. कार्य कार्यान्वयन बाधित किया जा रहा संभाल नहीं कर सकते।
  2. यह अज्ञात है कि कार्य कार्यान्वयन रद्दीकरण का समर्थन करता है।
  3. आप पहले से ही शुरू किए गए कार्यों को पूरा करने के लिए प्रतीक्षा कर रहे हैं।
1

मेरे पास एक उपयोग केस है जो आपके लिए दिलचस्प हो सकता है: मेरे पास एक एकल धागा है जो अनुसूचित कार्यों का एक सेट निष्पादित कर रहा है। कार्यों में से एक को या तो स्वयं या किसी अन्य कार्य द्वारा पुन: निर्धारित किया जा सकता है।

ऐसा करने के लिए, मैं कतार में मौजूदा प्रतिलिपि पर Future.cancel(false) का उपयोग करता हूं, और फिर कार्य को नए समय के लिए निर्धारित करता हूं।

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

संबंधित मुद्दे