Würde dieser Hook auch ausgelöst, wenn System.exit(1)er woanders ausgeführt wird? Ich versuche, diesem Muster zu folgen, um den kontrollierten Stopp für mein Multithread-Java-Programm zu handhaben, und finde, dass System.exit(1)die JVM dadurch nicht beendet wird.
Sie können einen Shutdown-Hook hinzufügen , um eine Bereinigung durchzuführen.
So was:
publicclassmyjava{
publicstaticvoidmain(String[] args){
Runtime.getRuntime().addShutdownHook(new Thread() {
@Overridepublicvoidrun(){
System.out.println("Inside Add Shutdown Hook");
}
});
System.out.println("Shut Down Hook Attached.");
System.out.println(5/0); //Operating system sends SIGFPE to the JVM//the JVM catches it and constructs a //ArithmeticException class, and since you //don't catch this with a try/catch, dumps//it to screen and terminates. The shutdown//hook is triggered, doing final cleanup.
}
}
Dann führen Sie es aus:
el@apollo:~$ javac myjava.java
el@apollo:~$ java myjava
Shut Down Hook Attached.
Exception in thread "main" java.lang.ArithmeticException: / by zero
at myjava.main(myjava.java:11)
Inside Add Shutdown Hook
Dies gilt jedoch für das gesamte Herunterfahren des Systems. Während es in den meisten Fällen funktioniert, wäre es ideal, wenn es auf dem geerbten Prozess funktioniert.
HINWEIS: Die Funktionalität innerhalb des sun. * -Pakets würde auch bedeuten, dass es möglicherweise nicht auf allen Betriebssystemen portabel ist / sich gleich verhält. Aber vielleicht möchten Sie es ausprobieren.
Nein - nicht genau. Die erwähnte Signalverarbeitungs-API kann verwendet werden, um die meisten nativen Betriebssystemsignale (Trap, Intr, Kill usw.) in Java Apps zu verarbeiten. Andererseits wird ShutdownHook nur aufgerufen, wenn JVM endgültig beendet wird (nachdem ein Kill-Signal empfangen wurde).
Arcamax
1
Ja, es sieht so aus, als hätten IBM Entwicklerarbeiten eine Website-Migration durchlaufen. Der Link funktioniert nicht mehr.
System.exit(1)
er woanders ausgeführt wird? Ich versuche, diesem Muster zu folgen, um den kontrollierten Stopp für mein Multithread-Java-Programm zu handhaben, und finde, dassSystem.exit(1)
die JVM dadurch nicht beendet wird.Sie können einen Shutdown-Hook hinzufügen , um eine Bereinigung durchzuführen.
So was:
public class myjava{ public static void main(String[] args){ Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.out.println("Inside Add Shutdown Hook"); } }); System.out.println("Shut Down Hook Attached."); System.out.println(5/0); //Operating system sends SIGFPE to the JVM //the JVM catches it and constructs a //ArithmeticException class, and since you //don't catch this with a try/catch, dumps //it to screen and terminates. The shutdown //hook is triggered, doing final cleanup. } }
Dann führen Sie es aus:
el@apollo:~$ javac myjava.java el@apollo:~$ java myjava Shut Down Hook Attached. Exception in thread "main" java.lang.ArithmeticException: / by zero at myjava.main(myjava.java:11) Inside Add Shutdown Hook
quelle
Eine andere Möglichkeit, Signale in Java zu verarbeiten, ist das Paket sun.misc.signal. Informationen zur Verwendung finden Sie unter http://www.ibm.com/developerworks/java/library/i-signalhandling/ .
HINWEIS: Die Funktionalität innerhalb des sun. * -Pakets würde auch bedeuten, dass es möglicherweise nicht auf allen Betriebssystemen portabel ist / sich gleich verhält. Aber vielleicht möchten Sie es ausprobieren.
quelle