2010-07-19 12 views

उत्तर

6

यदि आप इसकी सहायता कर सकते हैं तो आपको System.exit() पर कॉल नहीं करना चाहिए।

जावा प्रक्रिया से बाहर निकलने का सबसे अच्छा तरीका सभी धागे सामान्य रूप से बाहर निकलने देना है। यह वीएम को समाप्त कर देगा।

आपके मुख्य JFrame में, आपको setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) होना चाहिए।

फिर आप पर JFrame को बंद करने और ईडीटी से बाहर निकलने के लिए कॉल कर सकते हैं।

+3

यह 'DISPOSE_ON_EXIT' नहीं होना चाहिए? 'EXIT_ON_CLOSE' का उपयोग करने से थ्रेड को भी मारने का कारण बन जाएगा, जिससे उन्हें सामान्य रूप से बाहर निकलने की अनुमति नहीं मिलती है (जब उपयोगकर्ता JFrame को बंद करता है)। –

+2

मैं असहमत हूं। जीसी को चीजें बंद होने से पहले कुछ समय लगेगा और ऐप निकल जाएगा। System.exit को कॉल करने में कुछ भी गलत नहीं है, एक बार जब आप इसे बंद करने के साथ निपटाते हैं। फ़ाइलें, सॉकेट, और इस तरह के करीब System.exit को कॉल करने के बाद बस अपने आप को ढूंढें। – Mike

5

चूंकि वीएम System.exit() कॉल के बाद समाप्त हो गया है, मुझे नहीं लगता कि इससे कोई फर्क पड़ता है जिससे कॉल किया जा रहा है।

+0

मैं सहमत हूं। चूंकि बाहर निकलने के कारण() इसके रास्ते में सब कुछ मारता है, आपको वास्तव में परवाह नहीं करना चाहिए कि कौन सा धागा इसे कॉल करता है। – f1sh

1

System.exit() चल रहे धागे को नहीं बल्कि वर्चुअल मशीन को समाप्त करता है। तो इसे किसी भी धागे से बुलाया जा सकता है, परिणाम हमेशा एक जैसा होता है, और अगर वीएम मर जाता है, तो थ्रेड में सभी संभावित असंगत राज्य एक बार में मौजूद नहीं होंगे।

3

आप इसे किसी भी थ्रेड से कॉल कर सकते हैं, लेकिन यह IMHO का उपयोग करने के लिए कठोर है। आभासी मशीन समाप्त हो जाएगी, कोई फर्क नहीं पड़ता कि और क्या चल रहा है।

मैं dispose() पसंद करता हूं या बस बंद करता हूं (setDefaultCloseOperation(DISPOSE_ON_CLOSE)) किसी भी प्रदर्शित विंडो (जेएफआरएएम, जेडियलॉग, ...)। यदि केवल डेमॉन थ्रेड चल रहे हैं, तो वर्चुअल मशीन समाप्त हो जाएगी। यदि कुछ लाइव गैर-डिमन थ्रेड हैं, तो JVM समाप्त नहीं होगा और धागा अपना काम पूरा कर सकता है।
ऐसा करने से, मैं हमेशा किसी एक प्रोग्राम को शामिल कर सकता हूं बिना चिंता किए बिना अगर उनमें से कोई गलती से दूसरे को समाप्त कर देगा।

बहुत कम स्थिति है जहाँ JVM वास्तव में "मारा" करने की जरूरत है ...

0

स्विंग नियम नहीं हैं EDT धागा सामान्य रूप से समाप्त करने के लिए के लिए।

सबसे महत्वपूर्ण यह सुनिश्चित करना है कि सभी फ्रेम का निपटारा किया गया हो। दुर्भाग्यवश, यदि आप माता-पिता के बिना मोडल संवाद का उपयोग करते हैं तो यह स्पष्ट नहीं हो सकता है क्योंकि स्विंग ऐसे संवादों के लिए एक अदृश्य पैरेंट फ्रेम तैयार करेगी।

इस मामले में, आपको सभी फ़्रेम सूचीबद्ध करना होगा (आप इसके लिए Frame.getFrames() का उपयोग कर सकते हैं) और स्पष्ट रूप से dispose() उन्हें।

बेशक आपको यह सुनिश्चित करना होगा कि Thread जीवित है (दाएं को छोड़कर)। जेडीके से कुछ पुस्तकालयों और यहां तक ​​कि कुछ एपीआई गैर-डिमन थ्रेड बनाते हैं, जिन्हें आपको स्वयं बंद करना होगा।

अंत में, और सबसे महत्वपूर्ण बात यह है कि System.exit() को कॉल नहीं करना जावा वेब स्टार्ट वातावरण में काम नहीं करेगा (अधिक जानकारी प्राप्त करने के लिए this SO question पर एक नज़र डालें)।

तो, निष्कर्ष में, मेरी सलाह वास्तव में System.exit() पर कॉल करना होगा क्योंकि आप हमेशा यह नहीं जानते कि आपका एप्लिकेशन किस माहौल में लॉन्च किया जाएगा। लेकिन मैं उसमें एक महत्वपूर्ण बिंदु जोड़ूंगा: सुनिश्चित करें कि एक बिंदु है जिससे बाहर निकलें। से इसे कॉल करने से कोई भी थ्रेड ठीक रहेगा।

1

सिस्टम की किसी भी थ्रेड से सिस्टम.एक्सिट को कॉल करने में बिल्कुल कुछ भी गलत नहीं है।इसे "सामान्य रूप से" बाहर निकलने से अभ्यास में काम नहीं होता है, क्योंकि ऐप छोड़ने से पहले, आप पाएंगे कि ऐप सामान एकत्रित करते समय ऐप लटक जाएगा। मैंने बहुत सारे गुई स्विंग ऐप्स लिखे हैं, और इसे कॉल करने में बिल्कुल कुछ भी गलत नहीं है। यह या तो "कठोर" नहीं है। यह जावा रास्ता है।

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

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