我有一个Java应用程序,当用户选择开始->关闭时,我希望能够'优雅地'关闭它。我尝试过使用JVM关闭监听器通过Runtime.addShutdownHook(...),但由于无法从中使用任何UI元素,因此无法正常工作。
我还尝试在我的主应用程序UI窗口上使用退出处理程序,但据我所知,它没有暂停或停止关闭的方法。如何优雅地处理关闭?
之前提到的JNI方法可能会起作用。
你可以使用JNA,它基本上是JNI的包装器,使其更易于使用。额外的好处是它(至少在我看来)通常比原始的JNI更快,更易于维护。你可以在https://jna.dev.java.net/找到JNA。
如果你只是在开始菜单中启动应用程序,因为你想让它在Windows中像服务一样运行,你可以使用Java Service Wrapper,它可以在这里找到:http://wrapper.tanukisoftware.org/doc/english/download.jsp
sun.misc.Signal
和sun.misc.SignalHandler
内部类来替换默认的java.lang.Terminator
,并使用自定义的处理程序。不要忘记从那里调用System::exit
。JDK在响应WM_QUERYENDSESSION
时内部引发SIGTERM
。有关详细信息,请参阅awt_Toolkit.cpp。public static void setQuitStrategy(Runnable handler) throws Exception {
Class<?> signalClass = Class.forName("sun.misc.Signal");
Class<?> signalHandlerClass = Class.forName("sun.misc.SignalHandler");
Object signal = signalClass.getConstructor(String.class).newInstance("TERM");
Object signalHandler = Proxy.newProxyInstance(signalHandlerClass.getClassLoader(), new Class[] { signalHandlerClass }, (proxy, method, args) -> {
handler.run();
return null;
});
Method handle = signalClass.getMethod("handle", new Class[] { signalClass, signalHandlerClass });
handle.invoke(null, signal, signalHandler);
}