那里可以建网站,四川省的建设厅注册中心网站,全国企业名录大全,网站这么设置微信支付宝小编典典在极少数情况下#xff0c;虚拟机可能会中止#xff0c;即在不完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况#xff0c;例如在Unix上使用SIGKILL信号或在MicrosoftWindows上使用TerminateProcess调用。因此#xff0c;不幸的是#xff0c;我认为…小编典典在极少数情况下虚拟机可能会中止即在不完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况例如在Unix上使用SIGKILL信号或在MicrosoftWindows上使用TerminateProcess调用。因此不幸的是我认为在这里无事可做。Windows控制台中的CTRL-CLOSE信号。似乎不可调整。引用以上链接CTRLCLOSE当用户关闭控制台时系统会生成信号。控制台上连接的所有进程均会接收信号使每个进程都有机会在终止之前进行清理。当进程收到此信号时处理程序函数在执行任何清除操作后可以采取以下操作之一调用ExitProcess以终止该过程。返回FALSE。如果没有注册的处理程序函数返回TRUE则默认处理程序将终止该过程。返回TRUE。在这种情况下不会调用其他处理程序函数并且会弹出一个对话框询问用户是否终止该过程。如果用户选择不终止该过程则系统将不会关闭控制台直到该过程最终终止。UPD 。如果您可以接受本机调整则WinAPI SetConsoleCtrlHandler函数将为您消除默认行为打下基础。UPD2。关于Java信号处理和终止的启示是相对较老的文章但是“编写Java信号处理程序” 部分可能确实包含您所需要的内容。UPD3 。我已经尝试了以上文章中的 Java信号处理程序。它可以SIGINT很好地工作但不是我们需要的所以我决定随身携带SetConsoleCtrlHandler。结果有点复杂可能不值得在您的项目中实现。无论如何它可以帮助其他人。因此想法是保留对关闭处理程序线程的引用。使用JNI设置自定义本机控制台处理程序例程。在CTRLCLOSE信号上调用自定义Java方法。从该方法调用关闭处理程序。Java代码public class TestConsoleHandler {private static Thread hook;public static void main(String[] args) {System.out.println(Start);hook new ShutdownHook();Runtime.getRuntime().addShutdownHook(hook);replaceConsoleHandler(); // actually not replace but addtry {Thread.sleep(10000); // You have 10 seconds to close console} catch (InterruptedException e) {}}public static void shutdown() {hook.run();}private static native void replaceConsoleHandler();static {System.loadLibrary(TestConsoleHandler);}}class ShutdownHook extends Thread {public void run() {try {// do some visible worknew File(d:/shutdown.mark).createNewFile();} catch (IOException e) {e.printStackTrace();}System.out.println(Shutdown);}}本机replaceConsoleHandlerJNIEXPORT void JNICALL Java_TestConsoleHandler_replaceConsoleHandler(JNIEnv *env, jclass clazz) {env-GetJavaVM(jvm);SetConsoleCtrlHandler(HandlerRoutine, TRUE);}和处理程序本身BOOL WINAPI HandlerRoutine(__in DWORD dwCtrlType) {if (dwCtrlType CTRL_CLOSE_EVENT) {JNIEnv *env;jint res jvm-AttachCurrentThread((void **)(env), env);jclass cls env-FindClass(TestConsoleHandler);jmethodID mid env-GetStaticMethodID(cls, shutdown, ()V);env-CallStaticVoidMethod(cls, mid);jvm-DetachCurrentThread();return TRUE;}return FALSE;}而且有效。在JNI代码中为清除起见所有错误检查都被省略。关机处理程序将创建一个空文件d:\shutdown.mark来指示正确的关机。所有的源代码编译的二进制文件的测试在这里。2020-09-21