क्या Ctrl + सी जावा कमांड-लाइन एप्लिकेशन में सिग्नल करना संभव है? मैं कार्यक्रम को समाप्त करने से पहले कुछ संसाधनों को साफ करना चाहता हूं।जावा में Ctrl + C पकड़ना
उत्तर
आप वीएम जो चलाने हो जाता है जब भी वीएम बंद हो जाता है के लिए एक shutdown hook संलग्न कर सकते हैं:
कार्यक्रम:
जावा आभासी मशीन नीचे जवाब में घटनाओं के दो प्रकार के लिए बन्द हो जाता है सामान्य रूप से बाहर निकलता है, जब अंतिम गैर-डिमन थ्रेड निकलता है या जब बाहर निकलें (समतुल्य, System.exit) विधि का आह्वान किया जाता है, या
गुण यूजर मशीन को उपयोगकर्ता इंटरप्ट के जवाब में समाप्त कर दिया गया है, जैसे टाइपिंग Ctrl + सी, या सिस्टम लॉगऑफ या सिस्टम शट डाउन जैसे सिस्टम-वाइड इवेंट।
धागे के रूप शटडाउन हुक, कई नियमों का पालन करना है, हालांकि, इसलिए किसी भी समस्याओं से बचने के ध्यान से जुड़ा हुआ दस्तावेज़ पढ़ें है आप गुजरती हैं। इसमें थ्रेड-सुरक्षा, थ्रेड की त्वरित समाप्ति आदि शामिल हैं।
इसके अलावा, जैसा कि कमेंटर जेस्पर बताते हैं, शटडाउन हुक वीएम के सामान्य शट डाउन पर चलाने की गारंटी है, लेकिन अगर वीएम प्रक्रिया जबरन समाप्त हो जाती है तो वे ' टी। यह तब हो सकता है जब मूल कोड खराब हो या यदि आप जबरन प्रक्रिया को मार दें (kill -9
, taskkill /f
)।
लेकिन उन परिदृश्यों में सभी दांव किसी भी तरह से बंद हैं, इसलिए मैं इस पर बहुत अधिक विचार बर्बाद नहीं करता।
...
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();
}
}
});
आपका उदाहरण रास्पबेरीपीआई विशिष्ट है ('सॉफ्टपॉम', 'जीपीओओ')। आप उन विधि कॉल को छोड़ना चाह सकते हैं। – harpun
खबरदार बंद हुक सभी परिस्थितियों में चलने की गारंटी नहीं कर रहे हैं कि; ऐसी परिस्थितियां हो सकती हैं जहां वे नहीं चल रहे हैं, इसलिए अपने प्रोग्राम की सही कार्यप्रणाली को शटडाउन हुक में जो भी करते हैं उस पर निर्भर न करें। – Jesper
वे तब नहीं चल रहे हैं जब प्रक्रिया को मजबूती से समाप्त कर दिया जाता है ('टर्मिनेट प्रोसेस()' या 'सिगकिल') लेकिन यह सामान्य ऑपरेशन के बाहर है और चूंकि Ctrl + C पहले ही शटडाउन हुक द्वारा कवर किया गया है, इसलिए इसका उपयोग सुरक्षित है। यदि ओएस वास्तव में आपकी प्रक्रिया को समाप्त करता है तो आप बहुत कुछ नहीं कर सकते हैं। – Joey
अगर मैं 'मार' निष्पादित करता हूं (एक टीईआरएम सिग्नल भेज रहा हूं), तो क्या इसे शटडाउन हुक में पकड़ा जाएगा? (ध्यान दें कि यह 'kill -9' जैसा नहीं है जिसे मैं ऊपर से समझता हूं कि यह हुक में पकड़ा नहीं जाएगा।) – ADTC