2012-08-25 12 views
6

क्या शटडाउन हुक में स्विंग जोड़ने का कोई संभावित तरीका है (यानी, वीएम बंद करने पर पॉपअप प्रदर्शित करें)?मैं शटडाउन हुक में स्विंग का उपयोग कैसे करूं?

मुझे एहसास है कि अगर मैं एक नया जेएफआरएम बनाने की कोशिश करता हूं, तो यह मुझे एक त्रुटि देगा, क्योंकि यह शट डाउन हुक पंजीकृत करने का प्रयास करता है, जो विफल रहता है क्योंकि वीएम पहले ही बंद हो रहा है। मैं सिर्फ अगर वास्तव में इस

+3

मैं नहीं कह सकते, और यहां तक ​​कि आप coud अगर, मैं सलाह देते हैं कि आप न – MadProgrammer

+0

@MadProgrammer मैं चारों ओर देखा है, और कुछ भी नहीं मिला है, लेकिन मैं सोच रहा था कि यह कई अनुप्रयोगों के रूप में संभव हो जाना चाहिए आपको बंद करने पर न केवल एक पॉपअप विंडो दें, लेकिन अगर आप कंप्यूटर को बंद कर देते हैं (जो बदले में जावा वीएम को बंद कर देता है) –

+0

मेरे पास एक कार्यक्रम हाल ही में एक अपवाद फेंक दिया गया क्योंकि एक डेवलपर एक शट डाउन हुक के भीतर स्विंग घटक तक पहुंच रहा था (जावा 7 के तहत मुझे लगता है)। मैं कहूंगा कि आपको इस अवधारणा का पालन करने का प्रयास करने में कोई समस्या हो सकती है। समस्या का एक हिस्सा यह नहीं जान रहा है कि जेवीएम वास्तव में क्या स्थिति है, या जिस क्रम में शट डाउन हुक को – MadProgrammer

उत्तर

13

आपको वास्तव में ऐसा नहीं करना चाहिए।the Runtime.addShutdownHook specification से:

  • कार्यक्रम सामान्य रूप से बाहर निकालता है, जब अंतिम गैर-डेमॉन धागा बाहर निकलता है या जब exit:

    जावा आभासी मशीन घटनाओं के दो प्रकार के जवाब में बंद हो जाता है (समतुल्य रूप से, System.exit) विधि लागू की गई है, या

  • वर्चुअल मशीन को उपयोगकर्ता इंटरप्ट के जवाब में समाप्त कर दिया गया है, जैसे टाइपिंग ^C, या सिस्टम-वाइड इवेंट, जैसे उपयोगकर्ता लॉगऑफ या सिस्टम शटडाउन।

...

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

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

...

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

विशिष्ट चेतावनी यहाँ है कि आप नहीं सुझाव है कि यह कार्य करें:

  1. "शटडाउन हुक भी जल्दी से अपने काम को समाप्त करना चाहिए।"

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

  2. स्विंग पर टॉप AWT की, जिसका अंतर्निहित घटना-प्रेषण चलाता है "इस तरह के AWT घटना-प्रेषण धागा के रूप में अन्य धागा आधारित सेवाओं का उपयोग करने के उदाहरण के लिए, गतिरोध को जन्म दे सकती प्रयास" थ्रेड भी बंद करने की प्रक्रिया में हो सकता है।बंद होने के दौरान स्विंग या एडब्ल्यूटी का उपयोग करने का प्रयास न केवल मृत ताले के लिए नेतृत्व कर सकता है बल्कि किसी भी तरह से काम नहीं कर सकता है।

  3. "आभासी मशीन तो रोकता तो कोई गारंटी नहीं है के बारे में बनाया जा सकता है या नहीं, किसी भी बंद हुक चलाया जाएगा"

    कोई गारंटी अपने उपयोगकर्ता भी संभवतः अपने संदेश मिल सकता है बंद हुक के बाद से, कर रहे हैं केवल सामान्य या समाप्त होने पर ही चलाने की गारंटी दी जाती है - जब रुक जाती है या निरस्त हो जाती है।

+0

+1 कुछ अच्छा OP –

+1

+1 के लिए अधिक जानकारी और बहुत अच्छी जानकारी मिली – MadProgrammer

+0

यही वह है जो मैंने पहले समझा था, उम्मीद थी कि एक रास्ता होगा, लेकिन मुझे लगता है कि नहीं –

2
  1. स्विंग जीयूआई के आसपास किसी भी तरह से Event Dispatch Thread पर किया जाना चाहिए नहीं है, तो

    • पर Initial Thread

    • दिखाएँ JDialog or JOptionPane बनाएं कंटेनर

    • सोच रहा हूँ
    • Shutdown Hook

    • के लिए कॉल करें
  2. Simple way, लेकिन जरूरी अंत उपयोगकर्ता कार्रवाई (करीब JDialog)

+0

मुझे डर है कि मैं नहीं देखता कि आपके उत्तर में मूल प्रश्न के लिए प्रासंगिकता क्या है। –

+0

@ डंकन जोन्स वह इसका जवाब दे रहा है। उसका जवाब शटडाउन हुक + संभावित समाधान के लिंक के बारे में है ... –

+0

@mKorbel मुझे नहीं पता कि पहला विकल्प कैसे काम करेगा; मैं शटडाउन हुक के लिए फोन नहीं कर रहा हूं, यह एक यादृच्छिक अवसर के रूप में हो रहा है, मैं इसे पॉपअप विंडो से संभालना चाहता हूं। दूसरे के लिए, मुझे उसमें कुछ संभावित दिखाई देता है, हालांकि, RVMime # निष्पादन कार्य करेगा जब JVM/कंप्यूटर बंद हो रहा है? –

2

अगर वहाँ है, यह आप मदद नहीं करेगा।

शटडाउन हुक जेवीएम शट डाउन के हिस्से के रूप में असीमित रूप से आक्रमण किए जाते हैं, इसलिए एक "पुष्टि" संवाद वास्तव में कुछ भी पुष्टि नहीं करेगा क्योंकि आप शट डाउन प्रक्रिया को रोक या उलट नहीं सकते हैं। किसी उपयोगकर्ता को निर्णय लेने की प्रतीक्षा करना एक शटडाउन हुक का मतलब नहीं है। एक इंटरैक्टिव प्रोग्राम में शटडाउन हुक समझ में नहीं आता है। बंद हुक के लिए वास्तविक उपयोग मामला है:

रिहा संसाधन और अन्य गृह व्यवस्था के लिए जब JVM shutsdown

यह भी हुक शट डाउन नोट करने के लिए हमेशा अभ्यस्त और अधिक देखने के लिए, चलाने के लिए महत्वपूर्ण है मेरा जवाब यहां: How to shutdown java application correctly from C# one

+0

भले ही इसे असीमित रूप से संभाला जा सके, थ्रेड अभी भी डिमन नहीं है और इस प्रकार यह अभी भी काम कर सकता है ... नहीं कि आपको इसे __ever__ करना चाहिए। – oldrinb

+0

@veer true लेकिन मुझे लगता है कि ओपी का सबसे बड़ा समस्या यह है कि ऐप की सभी समाप्ति शटडाउन हुक –

-1

मुझे आपके प्रश्न के बारे में निश्चित नहीं है, लेकिन मुझे लगता है कि JVM बंद होने पर पॉपअप विंडो चलाने या प्रदर्शित करना असंभव है। सोने की तैयारी करते समय दौड़ने की कोशिश की तरह? सिर्फ अनुमान। :)

4

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

आप यह नहीं कर सकते हैं।

+0

+1 को अच्छी तरह से नहीं बुलाएगी "आपको कोई गारंटी नहीं है कि स्विंग इवेंट थ्रेड अभी भी चल रहा है" –

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