Catching Ctrl + C in Java

È ansible catturare il segnale Ctrl + C in un’applicazione della riga di comando java? Mi piacerebbe ripulire alcune risorse prima di terminare il programma.

È ansible colbind un hook di arresto alla VM che viene eseguita ogni volta che la macchina virtuale si arresta:

La macchina virtuale Java si spegne in risposta a due tipi di eventi:

  • Il programma si chiude normalmente quando l’ultimo thread non-demone viene chiuso o quando viene richiamato il metodo exit (equivalentemente, System.exit) o

  • La macchina virtuale viene terminata in risposta a un interrupt utente, ad esempio digitando Ctrl + C o un evento a livello di sistema, ad esempio la disconnessione dell’utente o l’arresto del sistema.

Il thread che si passa come hook di spegnimento deve seguire diverse regole, quindi, leggere attentamente la documentazione collegata per evitare qualsiasi problema. Ciò include l’assicurazione della sicurezza del filo, la chiusura rapida del filo, ecc.

Inoltre, come sottolinea il commentatore Jesper, gli hook di shutdown sono garantiti per l’esecuzione al normale spegnimento della VM, ma se il processo VM viene terminato forzatamente no. Questo può accadere se il codice nativo si taskkill /f o se si uccide forzatamente il processo ( kill -9 , taskkill /f ).

Ma in quegli scenari tutte le scommesse sono comunque in ordine, quindi non ci sprecherei troppo tempo a pensarci.

Solo per scopi di test della console rapidi …

 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(); } } });