2009-10-23 12 views
58

क्या Ctrl + सी जावा कमांड-लाइन एप्लिकेशन में सिग्नल करना संभव है? मैं कार्यक्रम को समाप्त करने से पहले कुछ संसाधनों को साफ करना चाहता हूं।जावा में Ctrl + C पकड़ना

उत्तर

65

आप वीएम जो चलाने हो जाता है जब भी वीएम बंद हो जाता है के लिए एक shutdown hook संलग्न कर सकते हैं:

  • कार्यक्रम:

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

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

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

इसके अलावा, जैसा कि कमेंटर जेस्पर बताते हैं, शटडाउन हुक वीएम के सामान्य शट डाउन पर चलाने की गारंटी है, लेकिन अगर वीएम प्रक्रिया जबरन समाप्त हो जाती है तो वे ' टी। यह तब हो सकता है जब मूल कोड खराब हो या यदि आप जबरन प्रक्रिया को मार दें (kill -9, taskkill /f)।

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

+0

खबरदार बंद हुक सभी परिस्थितियों में चलने की गारंटी नहीं कर रहे हैं कि; ऐसी परिस्थितियां हो सकती हैं जहां वे नहीं चल रहे हैं, इसलिए अपने प्रोग्राम की सही कार्यप्रणाली को शटडाउन हुक में जो भी करते हैं उस पर निर्भर न करें। – Jesper

+0

वे तब नहीं चल रहे हैं जब प्रक्रिया को मजबूती से समाप्त कर दिया जाता है ('टर्मिनेट प्रोसेस()' या 'सिगकिल') लेकिन यह सामान्य ऑपरेशन के बाहर है और चूंकि Ctrl + C पहले ही शटडाउन हुक द्वारा कवर किया गया है, इसलिए इसका उपयोग सुरक्षित है। यदि ओएस वास्तव में आपकी प्रक्रिया को समाप्त करता है तो आप बहुत कुछ नहीं कर सकते हैं। – Joey

+0

अगर मैं 'मार' निष्पादित करता हूं (एक टीईआरएम सिग्नल भेज रहा हूं), तो क्या इसे शटडाउन हुक में पकड़ा जाएगा? (ध्यान दें कि यह 'kill -9' जैसा नहीं है जिसे मैं ऊपर से समझता हूं कि यह हुक में पकड़ा नहीं जाएगा।) – ADTC

14
बस त्वरित कंसोल परीक्षण प्रयोजनों के लिए

...

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(200); 
       System.out.println("Shouting down ..."); 
       //some cleaning up code... 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
+2

आपका उदाहरण रास्पबेरीपीआई विशिष्ट है ('सॉफ्टपॉम', 'जीपीओओ')। आप उन विधि कॉल को छोड़ना चाह सकते हैं। – harpun

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