سؤال

هل من الممكن التقاط كنترول+ج إشارة في تطبيق سطر الأوامر 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();
            }
        }
    });
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top