2013-07-22 7 views
7

मेरे पास एक अच्छी तरह से परिभाषित कोशिश/कैच/अंततः श्रृंखला है जो अंततः सामान्य परिस्थितियों में ठीक से ब्लॉक को निष्पादित करता है और निष्पादित करता है, हालांकि जब कोई समय-समय पर जीयूआई में लाल एक्स को हिट करता है, तो प्रोग्राम पूरी तरह से मौजूद होता है (कोड = 0) और मुख्य धागे के आखिरकार ब्लॉक को बुलाया नहीं जाता है।एक आवेदन से बाहर निकलना?

वास्तव में, मैं चाहता हूं कि प्रोग्राम लाल-एक्स के एक क्लिक पर बाहर निकलें, लेकिन जो मैं नहीं चाहता वह आखिरकार {} ब्लॉक का छोड़ रहा है!

class GUI { // ... 
... 
mainFrame.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent evt) { 
    try { 
     processObject.getIndicatorFileStream().close(); 
    } catch (Exception ignore) {} 
    System.exit(0); 
    } 
}); 
... 
} 

लेकिन मैं चाहता हूँ: मैं इन सबसे छुटकारा अंत में जीयूआई में मैन्युअल रूप से ब्लॉक, लेकिन मैं वास्तव में यह इस तरह से करने के लिए के बाद से मैं जीयूआई वास्तविक कार्यक्रम से decoupled चाहते नहीं करना चाहते का सबसे महत्वपूर्ण हिस्सा में डाल सिर्फ इस तरह एक कॉल करने के लिए पसंद करते हैं:

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

और सुनिश्चित करें कि सभी अंत में {} ब्लॉक से बाहर निकलें के बाद प्रत्येक धागे से कहा जाता हो सकते हैं।

मुझे पता है कि यह वास्तव में अपेक्षित है। यदि आवेदन एक अलग थ्रेड से बंद है (जीयूआई थ्रेड कहें) तो मुख्य धागा बस अपने ट्रैक में रुक जाएगा।

संक्षेप में - मैं कैसे सुनिश्चित करूं कि एक System.exit (0) या JFrame.EXIT_ON_CLOSE अभी भी प्रत्येक थ्रेड को निष्पादित करने के लिए अवरुद्ध कर देगा?

उत्तर

8

आप कोई अन्य डिजाइन परिवर्तन विकल्प हैं तो क्या आप की आवश्यकता हो सकती एक JVM बंद हुक, जो जब System.exit कहा जाता है कोड का एक टुकड़ा चलाने के लिए जोड़ा जा सकता है।

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

Runtime.getRuntime().addShutdownHook(Thread) 

पढ़ें::

आप एक बंद हुक यहाँ उल्लेख रूप में जोड़ सकते

http://java.dzone.com/articles/know-jvm-series-2-shutdown

सावधानी के शब्द:

हमें यह ध्यान में रखना चाहिए कि यह गारंटी नहीं है कि शट डाउन हुक हमेशा चलेंगे। यदि कुछ आंतरिक त्रुटि, के कारण JVM क्रैश हो जाता है तो यह एक निर्देश निष्पादित करने का मौका दिए बिना क्रैश हो सकता है। इसके अलावा, यदि ओ/एस एक सिगिल (http://en.wikipedia.org/wiki/SIGKILL) सिग्नल (यूनिक्स/लिनक्स में मार -9) या टर्मिनेटप्रोसेस (विंडोज) देता है, तो एप्लिकेशन को किसी भी सफाई गतिविधियों की प्रतीक्षा किए बिना तत्काल समाप्त कर दिया जाता है। उपर्युक्त के अलावा, को JVM को Runime.halt() विधि को कॉल करके शटडाउन हुक चलाने की अनुमति दिए बिना भी संभव है।

+1

शायद यह ध्यान रखना महत्वपूर्ण है कि यह हमेशा चलाने के लिए गारंटी नहीं है (उदा। जब जेवीएम दुर्घटनाग्रस्त हो जाता है)। – DannyMo

+1

@damo हां यह एक महत्वपूर्ण बात है। मुझे इसे –

+1

उत्तर में जोड़ने दें यह बुरी सलाह है। शट डाउन हुक ** ** नियमित रूप से बाहर निकलने के दिन के रूप में कभी भी ** ** का उपयोग नहीं किया जाना चाहिए। वे केवल अंतिम उपाय हैं, जब सब कुछ विफल रहता है, बचाया जा सकता है जिसे बचाया जा सकता है। –

3

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

हालांकि, अपने लक्ष्य को प्राप्त करने को उचित तरीके से और कार्यक्रम तर्क से decoupled जीयूआई है, जीयूआई से एक भी 'प्रस्थान' संकेत है, जो सभी आवेदन सफाई है, जो एक में लिखा है ट्रिगर किया जाएगा जारी करने के लिए है पूरी तरह से अलग वर्ग। यदि आपके पास थ्रेड चल रहे हैं, तो उनमें से प्रत्येक में interrupt तंत्र को लागू करें।

निकास संकेत प्राप्त करने के कई तरीके हैं। उदाहरण के लिए, आपका व्यावसायिक कोड एक विशेष घटना के लिए एक जीयूआई श्रोता पंजीकृत कर सकता है, जो सफाई को ट्रिगर करेगा। आपके पास एक धागा भी हो सकता है जो await पर CountDownLatch पर कुछ भी नहीं करता है जो GUI से countDown होगा।

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

संक्षेप में, एप्लिकेशन शट डाउन को साफ करने का कोई शाही तरीका नहीं है। आपको प्रत्येक विशिष्ट चिंता के लिए विशिष्ट तंत्र लागू करना होगा।

+0

कोई उदाहरण कोड? मैं सुनता हूं कि आप क्या कह रहे हैं और यह तार्किक लगता है (मैं मूल रूप से इस बात के उदाहरणों की तलाश कर रहा हूं) –

+0

क्या आप इसके बारे में अधिक जानकारी दे सकते हैं, या Google को कुछ लिंक या वाक्यांश दे सकते हैं? – Hoto

+1

@hoto 'थ्रेड # इंटरप्ट 'के लिए Google की एक बात है; 'काउंटरडाउन लच' एक और है; 'एडब्ल्यूटी कस्टम इवेंट' तीसरा है। –

0
आधुनिक जावा के साथ

, Window.dispose() सभी आवेदन खिड़कियों पर, System.exit(0) से एक AWT अनुप्रयोग से बाहर करने के लिए और अधिक सुंदर संभावना प्रदान करते हैं, देख सकते हैं
https://docs.oracle.com/javase/8/docs/api/java/awt/Window.html#dispose--

/** Listens and closes AWT windows. 
* The class is implemented as singleton since only one is needed. 
*/ 
public class ExitListener extends WindowAdapter { 

    /** the instance object */ 
    private static final ExitListener INSTANCE = new ExitListener(); 

    // hide the constructor 
    private ExitListener() {} 

    /** retrieve the listener object */ 
    public static ExitListener getInstance() { 
    return INSTANCE; 
    } 

    @Override 
    public void windowClosing (final WindowEvent e) { 
    e.getWindow().dispose(); 
    } 
} 

और अपने विंडोज़

window.addWindowListener(ExitListener.getInstance()); 

हालांकि साथ प्रतिकूल वातावरण में सावधान रहें, देखें:
https://docs.oracle.com/javase/8/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown

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