Ich versuche sicherzustellen, dass meine Java-Anwendung angemessene Schritte unternimmt, um robust zu sein. Dazu gehört auch das ordnungsgemäße Herunterfahren. Ich lese über Shutdown-Hooks und verstehe nicht, wie ich sie in der Praxis einsetzen kann.
Gibt es da draußen ein praktisches Beispiel?
Angenommen, ich hatte eine wirklich einfache Anwendung wie die folgende, die Zahlen in eine Datei schreibt, 10 in eine Zeile, in Stapeln von 100, und ich möchte sicherstellen, dass ein bestimmter Stapel beendet wird, wenn das Programm unterbrochen wird. Ich kann einen Shutdown-Hook registrieren, habe aber keine Ahnung, wie ich ihn in meine Anwendung integrieren kann. Irgendwelche Vorschläge?
package com.example.test.concurrency;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class GracefulShutdownTest1 {
final private int N;
final private File f;
public GracefulShutdownTest1(File f, int N) { this.f=f; this.N = N; }
public void run()
{
PrintWriter pw = null;
try {
FileOutputStream fos = new FileOutputStream(this.f);
pw = new PrintWriter(fos);
for (int i = 0; i < N; ++i)
writeBatch(pw, i);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
finally
{
pw.close();
}
}
private void writeBatch(PrintWriter pw, int i) {
for (int j = 0; j < 100; ++j)
{
int k = i*100+j;
pw.write(Integer.toString(k));
if ((j+1)%10 == 0)
pw.write('\n');
else
pw.write(' ');
}
}
static public void main(String[] args)
{
if (args.length < 2)
{
System.out.println("args = [file] [N] "
+"where file = output filename, N=batch count");
}
else
{
new GracefulShutdownTest1(
new File(args[0]),
Integer.parseInt(args[1])
).run();
}
}
}
java
shutdown-hook
Jason S.
quelle
quelle
Antworten:
Sie können Folgendes tun:
.interrupt
die Arbeitsthreads, wenn sie in einem blockierenden Aufruf auf Daten warten)writeBatch
in Ihrem Fall ausgeführt) abgeschlossen sind, indem Sie dieThread.join()
Methode für die Arbeitsthreads aufrufen .Einige skizzenhafte Codes:
static volatile boolean keepRunning = true;
In run () wechseln Sie zu
In main () fügen Sie hinzu:
So mache ich ungefähr ein elegantes "Alle Clients ablehnen, wenn ich Control-C drücke" im Terminal.
Aus den Dokumenten :
Das heißt, ein Shutdown-Hook hält die JVM so lange am Laufen, bis der Hook beendet wurde (von der run () -Methode zurückgegeben).
quelle
mainThread
es sich um einen Daemon-Thread handelt, wirdjoin
garantiert, dass wir darauf warten, dass er beendet wird, bevor die JVM heruntergefahren wird.Shutdown Hooks sind nicht gestartete Threads, die bei Runtime.addShutdownHook () registriert sind. JVM übernimmt keine Garantie für die Reihenfolge, in der Shutdown Hooks gestartet werden. Weitere Informationen finden Sie unter http://techno-terminal.blogspot.in/2015/08 /shutdown-hooks.html
quelle