2011-11-17 8 views
9

Se aggiungo un gancio arresto al tempo di esecuzione del mio programma Java in questo modo:Quando Ganci arresto rompere le cattive

public class MyShutdownHook implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     // Stuff I want executed anytime 
     // the program, Java, or the OS exits normally, 
     // crashes, or terminates unexpectedly for any reason. 
    } 
} 

// The in another method... 
Runtime.getRuntime().addShutdownHook(new MyShutdownHook()); 

... poi ci sono mai eventuali situazioni in cui tale metodo run() non eseguirà quando il programma/Java/OS esce normalmente, si blocca o si interrompe in modo imprevisto? In tal caso, quali situazioni sarebbero in grado di aggirare il gancio di arresto di Runtime e perché?

+1

Mai sconto la possibilità di un attacco nucleare sul tuo computer. –

+0

chiedi maggiori informazioni oltre alla descrizione di javadoc di come funziona? –

+0

@ Mark Peters::) scherzo divertente ... Ma non dimenticare che * SIGKILL * praticamente * è * un waepon atomico;) Sia su Linux che su OS X (due nomi solo due Un * x-like comunemente usati dagli sviluppatori) un * kill -9 * è * garantito * per uccidere istantaneamente il processo e rilasciare le sue risorse, senza fare domande. No * ShutDownHook *. No niente. Ora sono d'accordo: un processo Java non vedrà alcuna differenza tra un * kill -9 * e un attacco nucleare; – TacticalCoder

risposta

6
  • Se il processo viene interrotto, un hook di arresto non verrà eseguito.

  • Se il processo si interrompe, un hook di arresto non verrà eseguito.

  • Se si dispone di un servizio di Windows e il gancio di arresto richiede troppo tempo per essere eseguito, verrà terminato.

+1

Ricordare che viene ucciso solo da SIGKILL, SIGTERM e simili, ma viene eseguito ancora il gancio di spegnimento – Jarek

+2

Se al processo viene inviato un segnale SIGTERM (normale comando "kill" in UNIX), verrà eseguito il hook di arresto. Fallirà solo se inviato SIGKILL (kill -9). – Adamski

+0

Se si vuole essere pedanti, se io 'kill -11 ' il processo Java non eseguirà il hook di shutdown. Anche se penso che potresti dire che cade sotto il proiettile "crash". –

3

Se si estrae la spina dal retro del computer, il gancio di arresto non funzionerà. Altre situazioni includono:

  • Il processo viene ucciso su un OS POSIX con SIGKILL (-9).
  • Analogamente, se si sceglie di terminare un processo "non rispondente" in Windows, il hook di chiusura potrebbe non essere completato.
0

Eseguono solo se il processo "si arresta normalmente". Se il processo viene ucciso con forza dal sistema operativo o se si arresta in modo anomalo a causa di problemi relativi alle risorse (ad esempio, memoria esaurita), i hook di arresto non verranno richiamati.

0

quando fate Runtime.getRuntime().halt() JVM o quando il sistema operativo uccide il processo senza il suo funzionamento ogni pulizia, anche quando si è eclissi terminare il programma (quando si esegue sotto eclissi)

0

Ogni volta che la JVM può uscire con garbo, viene eseguito il hook di arresto. Non viene eseguito se:

  • La JVM si arresta in modo anomalo. (A seconda di come/quando si blocca, il gancio può ancora correre, ma non ci sono garanzie sono fatti)
  • La JVM ottiene SIGKILL o simili, ed è subito fermato dal sistema operativo