आपको वास्तव में ऐसा नहीं करना चाहिए।the Runtime.addShutdownHook
specification से:
- कार्यक्रम सामान्य रूप से बाहर निकालता है, जब अंतिम गैर-डेमॉन धागा बाहर निकलता है या जब
exit
:
जावा आभासी मशीन घटनाओं के दो प्रकार के जवाब में बंद हो जाता है (समतुल्य रूप से, System.exit
) विधि लागू की गई है, या
- वर्चुअल मशीन को उपयोगकर्ता इंटरप्ट के जवाब में समाप्त कर दिया गया है, जैसे टाइपिंग
^C
, या सिस्टम-वाइड इवेंट, जैसे उपयोगकर्ता लॉगऑफ या सिस्टम शटडाउन।
...
शटडाउन हुक एक आभासी मशीन के जीवन चक्र में एक नाजुक समय पर चलाने और इसलिए रक्षा कोडित किया जाना चाहिए। उन्हें, विशेष रूप से, थ्रेड-सुरक्षित होने के लिए लिखा जाना चाहिए और जितना संभव हो सके डेडलॉक्स से बचने के लिए। उन्हें उन सेवाओं पर भी अंधेरे से भरोसा नहीं करना चाहिए जो अपने स्वयं के शटडाउन हुक पंजीकृत कर सकते हैं और इसलिए खुद को बंद करने की प्रक्रिया में हो सकते हैं। एडब्ल्यूटी-इवेंट-प्रेषण धागे जैसी अन्य थ्रेड-आधारित सेवाओं का उपयोग करने के प्रयास, उदाहरण के लिए, डेडलॉक्स का कारण बन सकते हैं।
शटडाउन हुक को भी अपना काम जल्दी से पूरा करना चाहिए। जब कोई प्रोग्राम exit
को आमंत्रित करता है तो उम्मीद है कि वर्चुअल मशीन तुरंत बंद हो जाएगी और बाहर निकल जाएगी। जब वर्चुअल मशीन को उपयोगकर्ता लॉगऑफ या सिस्टम शटडाउन के कारण समाप्त कर दिया जाता है तो अंतर्निहित ऑपरेटिंग सिस्टम केवल एक निश्चित समय की अनुमति दे सकता है जिसमें बंद होना और बाहर निकलना है। इसलिए किसी भी उपयोगकर्ता की बातचीत का प्रयास करने या शट डाउन हुक में लंबे समय से चलने वाले गणना करने के लिए यह अचूक है।
...
दुर्लभ परिस्थितियों में आभासी मशीन गर्भपात हो सकता है, कि, सफाई से बंद किए बिना चलना बंद है। यह तब होता है जब वर्चुअल मशीन को बाहरी रूप से समाप्त कर दिया जाता है, उदाहरण के लिए यूनिक्स पर SIGKILL
सिग्नल या TerminateProcess
माइक्रोसॉफ्ट विंडोज पर कॉल करें। वर्चुअल मशीन भी निरस्त हो सकती है यदि कोई देशी विधि अजीब हो जाती है, उदाहरण के लिए, आंतरिक डेटा संरचनाओं को दूषित करना या किसी भी प्रकार की स्मृति को एक्सेस करने का प्रयास करना। यदि वर्चुअल मशीन बंद हो जाती है तो कोई शटडाउन हुक चलाने के बारे में कोई गारंटी नहीं दी जा सकती है।
विशिष्ट चेतावनी यहाँ है कि आप नहीं सुझाव है कि यह कार्य करें:
"शटडाउन हुक भी जल्दी से अपने काम को समाप्त करना चाहिए।"
कुछ भी पर निर्भर है कि कुछ समय ले अपने काम करने के लिए हो सकता है, या JOptionPane
संवाद की तरह उपयोगकर्ता के इनपुट पर अनिश्चित काल के लिए अवरुद्ध, क्या आप अपने बंद हुक में करना चाहिए नहीं है।
स्विंग पर टॉप AWT की, जिसका अंतर्निहित घटना-प्रेषण चलाता है "इस तरह के AWT घटना-प्रेषण धागा के रूप में अन्य धागा आधारित सेवाओं का उपयोग करने के उदाहरण के लिए, गतिरोध को जन्म दे सकती प्रयास" थ्रेड भी बंद करने की प्रक्रिया में हो सकता है।बंद होने के दौरान स्विंग या एडब्ल्यूटी का उपयोग करने का प्रयास न केवल मृत ताले के लिए नेतृत्व कर सकता है बल्कि किसी भी तरह से काम नहीं कर सकता है।
"आभासी मशीन तो रोकता तो कोई गारंटी नहीं है के बारे में बनाया जा सकता है या नहीं, किसी भी बंद हुक चलाया जाएगा"
कोई गारंटी अपने उपयोगकर्ता भी संभवतः अपने संदेश मिल सकता है बंद हुक के बाद से, कर रहे हैं केवल सामान्य या समाप्त होने पर ही चलाने की गारंटी दी जाती है - जब रुक जाती है या निरस्त हो जाती है।
मैं नहीं कह सकते, और यहां तक कि आप coud अगर, मैं सलाह देते हैं कि आप न – MadProgrammer
@MadProgrammer मैं चारों ओर देखा है, और कुछ भी नहीं मिला है, लेकिन मैं सोच रहा था कि यह कई अनुप्रयोगों के रूप में संभव हो जाना चाहिए आपको बंद करने पर न केवल एक पॉपअप विंडो दें, लेकिन अगर आप कंप्यूटर को बंद कर देते हैं (जो बदले में जावा वीएम को बंद कर देता है) –
मेरे पास एक कार्यक्रम हाल ही में एक अपवाद फेंक दिया गया क्योंकि एक डेवलपर एक शट डाउन हुक के भीतर स्विंग घटक तक पहुंच रहा था (जावा 7 के तहत मुझे लगता है)। मैं कहूंगा कि आपको इस अवधारणा का पालन करने का प्रयास करने में कोई समस्या हो सकती है। समस्या का एक हिस्सा यह नहीं जान रहा है कि जेवीएम वास्तव में क्या स्थिति है, या जिस क्रम में शट डाउन हुक को – MadProgrammer