2010-04-21 15 views
5

अब तक मैंने अपने आवेदन को अकेले स्टैंड के रूप में उपयोग किया था। इसलिए, जब उपयोगकर्ता ने "रोकें" बटन दबाया तो मैंने System.exit(0); कहा और यह ठीक था।मैं अपने सॉफ़्टवेयर को सुरक्षित तरीके से कैसे बंद कर सकता हूं?

अब मेरे आवेदन को किसी अन्य प्रोग्राम से (प्रोग्रामेटिक तरीके से) कहा जाएगा। तो, मुझे डर है कि System.exit(0); न केवल मेरी प्रक्रिया को मार देगा बल्कि बाहरी सॉफ्टवेयर भी शुरू करेगा जो मेरे कार्यक्रम को शुरू करता है।

तो, बाहरी सॉफ़्टवेयर से संबंधित अनुरोध प्राप्त होने पर मेरे एप्लिकेशन को बंद करने का सही तरीका क्या है? मेरा आवेदन एक जीयूआई आवेदन है। इसलिए, मैं खिड़की को बंद करना चाहता हूं लेकिन मैं अपने कार्यक्रम द्वारा किए गए सभी प्रक्रियाओं को भी बंद करना चाहता हूं।

जोड़ा:

अधिक विशिष्ट होना करने के लिए, मैं सभी धागे मेरा कार्यक्रम द्वारा शुरू किया बंद करना चाहते हैं। मेरा प्रोग्राम किसी भी ओएस प्रक्रिया या किसी अन्य कार्यक्रम शुरू नहीं करता है।

+0

@Roman: * * "मेरे कार्यक्रम द्वारा की गई प्रक्रियाओं" * * क्या आपका मतलब है कि आपके जावा प्रोग्राम चल रहे सभी थ्रेड चल रहे हैं या आपके प्रोग्राम को स्पॉन किया है, कहें, अन्य निष्पादन योग्य (अन * एक्स शैल प्रक्रियाएं, .exe, अन्य जावा प्रोग्राम उनके वीएम में चल रहा है, जो भी हो)? – SyntaxT3rr0r

+0

@WizardOfOdds, मेरा मतलब है "मेरे जावा प्रोग्राम चल रहे सभी धागे चल रहे हैं"। – Roman

+1

आपका प्रोग्राम कैसे लागू किया जाता है? क्या इसका कुछ तरीका पहले से चल रहे जावा प्रोग्राम द्वारा बुलाया गया है, तो प्रभावी रूप से दोनों एक प्रोग्राम बन गए हैं? या अन्य प्रोग्राम आपके प्रोग्राम के साथ एक नया जावा वीएम शुरू करने के लिए सिस्टम कॉल कर रहा है? –

उत्तर

0

जब तक आपका प्रोग्राम दूसरों के साथ एक एप्लिकेशन सर्वर साझा नहीं कर रहा है, System.exit(0) पर कॉल करके VM को बंद करना सभी थ्रेड को समाप्त करता है। आप कुछ बंद होने से पहले कोड को साफ करना चाहते हैं, http://java.sun.com/j2se/1.4.2/docs/guide/lang/hook-design.html

+0

@ स्टैकर, क्या आपका मतलब है कि 'System.exit (0)' बाहरी सॉफ़्टवेयर के थ्रेड सहित मेरे थ्रेड को बंद कर देगा (जिसने मेरा प्रोग्राम शुरू किया था)। – Roman

+1

यह जेवीएम को मार देगा। तो अगर बाहरी सॉफ्टवेयर ने जावा प्रोग्राम को बढ़ाकर अपना प्रोग्राम शुरू किया, तो यह ठीक होगा। यदि बाहरी सॉफ़्टवेयर जावा कोड है जो बस आपकी कक्षा (एसएस) का एक उदाहरण बनाता है और उन्हें चलाता है, तो वह बाहरी कोड भी मारे जायेगा। –

2

धागे आप शुरू की है कर रहे हैं:

Javadoc System.exit से वर्तमान में चल रहे जावा वर्चुअल मशीन)

संपादित समाप्त हो जाता है फिर भी सिस्टम.एक्सिट (0) को कॉल करने के बाद उन्हें प्रोसेस करना होगा। कुछ मामलों में, यह आपके आवेदन को असंगत स्थिति में छोड़ सकता है। कल्पना कीजिए कि थ्रेड उदाहरण के लिए फाइल सहेज रहा था।

आपको यह सुनिश्चित करना चाहिए कि आपके थ्रेड सिस्टम.एक्सिट को कॉल करने से पहले मरने के लिए सभी 'खुश' हैं।

एक तकनीक जिसे आप लंबे समय तक चलने वाले धागे के साथ उपयोग कर सकते हैं वह जहरीला है। ऐसा करने के लिए आप धागे को एक संदेश भेजते हैं कि उन्हें अब कृपा से मरना चाहिए - यानी एक पॉसन संदेश। एक बार जब वे सभी की मृत्यु हो जाए, तो स्विंग इवेंट हैंडलिंग थ्रेड को समाप्त करने के लिए System.exit (0) को कॉल करना सुरक्षित है।

जहरीलेपन को लागू करने के विभिन्न तरीकों के भार, आप केवल वैश्विक ध्वज चर सेट कर सकते हैं कि धागे यह देखने के लिए जांच करते हैं कि वे जहर गए हैं या आप जावा 5 थ्रेडिंग लाइब्रेरी का उपयोग कर सकते हैं। उदाहरण के लिए इस जावाडोक पर एक नजर डालें और आप इस तकनीक के लिए संदर्भ मिल जाएगा: ड्रॉप-में सिस्टम के लिए प्रतिस्थापन है

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

0

वहाँ पर "एक आकार फिट सभी" इस का जवाब है कि दुर्भाग्य से .exit।

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

यह प्रश्न बहिष्कृत Thread.stop (आदि) विधियों से बहुत अलग नहीं है, विशेष रूप से System.exit को कुछ और सम्मान के साथ बदलने के संबंध में। उस प्रकाश में, why is Thread.stop() deprecated page उपयोगी पढ़ने हो सकता है।

मुख्य धागे के ढेर को खोलने के लिए एक अपवाद फेंकने वाला एक कस्टम (ApplicationStopException जैसा कुछ कहा जाता है) इतना बुरा विचार नहीं है; यह आपको अपने कोड पर विशेष तर्क को संभालने से रोकता है और इसके बजाय "संदेश" को उच्च स्तर तक फैलाने देता है, जहां वे आपके प्रोग्राम से बाहर निकलने के लिए जो भी कार्रवाई कर सकते हैं, वह कर सकते हैं।

0

मैं आपको धागे को रोकने के लिए फ़्लैगिंग करने की सलाह देता हूं ताकि थ्रेड को पता चल जाए कि इसे कब रोकना है। जीयूआई और विंडो के लिए, आप frame.dispose() को कॉल कर सकते हैं।

System.exit() के लिए, मुझे लगता है कि यह कॉलर को प्रभावित नहीं करेगा, आप यह देखने का प्रयास कर सकते हैं कि वास्तविक प्रभाव क्या है, लेकिन जैसा कि अन्य लोगों ने पहले ही अनुशंसा की है, इसे सीधे इस तरह से कॉल न करें, बस धागे को रोक दें अपने आप से