ShutdownHook
アプリケーションに を追加してみませんか?
シャットダウン フックは、単に初期化されているが開始されていないスレッドです。仮想マシンがシャットダウン シーケンスを開始すると、登録されているすべてのシャットダウン フックが不特定の順序で開始され、同時に実行されます。finalization-on-exit が有効になっている場合、すべてのフックが終了すると、呼び出されていないすべてのファイナライザーが実行されます。最後に、仮想マシンが停止します。exit メソッドの呼び出しによってシャットダウンが開始された場合、非デーモン スレッドと同様に、デーモン スレッドはシャットダウン シーケンス中も実行し続けることに注意してください。
これにより、シャットダウンする前に jar を正常に終了できます。
public class ShutdownHookDemo {
public void start() {
System.out.println("Demo");
ShutdownHook shutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
public static void main(String[] args) {
ShutdownHookDemo demo = new ShutdownHookDemo();
demo.start();
try {
System.in.read();
}
catch(Exception e) {
}
}
}
class ShutdownHook extends Thread {
public void run() {
System.out.println("Shutting down");
//terminate all other stuff for the application before it exits
}
}
注意することが重要です
シャットダウン フックは、次の場合に実行されます。
- プログラムは正常に存在します。たとえば、System.exit() が呼び出されるか、最後の非デーモン スレッドが終了します。
- 仮想マシンが終了します。たとえば、CTRL-C。これは kill -SIGTERM pid または
- Unix システムでは kill -15 pid。
次の場合、シャットダウン フックは実行されません。
- 仮想マシンが中止される
- SIGKILL シグナルは、Unix システムの仮想マシン プロセスに送信されます。例 kill -SIGKILL pid または kill -9 pid
- TerminateProcess 呼び出しが Windows システムのプロセスに送信されます。
または、必要に応じて、これを使用してクラスのメソッドを呼び出すことができます。
public class ReflectionDemo {
public void print(String str, int value) {
System.out.println(str);
System.out.println(value);
}
public static int getNumber() { return 42; }
public static void main(String[] args) throws Exception {
Class<?> clazz = ReflectionDemo.class;//class name goes here
// static call
Method getNumber = clazz.getMethod("getNumber");
int i = (Integer) getNumber.invoke(null /* static */);
// instance call
Constructor<?> ctor = clazz.getConstructor();
Object instance = ctor.newInstance();
Method print = clazz.getMethod("print", String.class, Integer.TYPE);
print.invoke(instance, "Hello, World!", i);
}
}
クラスを動的にロードするには:
ClassLoader loader = URLClassLoader.newInstance(
new URL[] { yourURL },
getClass().getClassLoader()
);
Class<?> clazz = Class.forName("mypackage.MyClass", true, loader);
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);
参考文献: