اصطياد Ctrl+C في Java
-
05-07-2019 - |
سؤال
هل من الممكن التقاط كنترول+ج إشارة في تطبيق سطر الأوامر Java؟ أرغب في تنظيف بعض الموارد قبل إنهاء البرنامج.
المحلول
يمكنك إرفاق ملف خطاف الإغلاق إلى VM الذي يتم تشغيله كلما أغلق VM:
يغلق جهاز Java Virtual استجابة لنوعين من الأحداث:
يخرج البرنامج بشكل طبيعي ، عندما يخرج آخر خيط غير Daemon أو عندما يتم استدعاء طريقة الخروج (ما يعادلها ، System.exit) ، أو
يتم إنهاء الجهاز الظاهري استجابة لمقاطعة المستخدم ، مثل الكتابة كنترول+ج, أو حدث على مستوى النظام ، مثل تسجيل الدخول للمستخدم أو إيقاف تشغيل النظام.
يجب أن يتبع الخيط الذي تمريره كخطاف إيقاف التشغيل عدة قواعد ، لذلك اقرأ الوثائق المرتبطة بعناية لتجنب أي مشاكل. وهذا يشمل ضمان سلامة الخيوط ، وإنهاء سريع للخيط ، إلخ.
وأيضًا ، كما يشير المعلق Jesper ، يتم ضمان خطاف الإغلاق على إيقاف تشغيل VM العادي ولكن إذا تم إنهاء عملية VM بالقوة. يمكن أن يحدث هذا إذا تلاشى الكود الأصلي أو إذا قتلت العملية قسراً (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();
}
}
});