小编典典

在极少数情况下,虚拟机可能会中止,即在不完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在Unix上使用SIGKILL信号或在Microsoft

Windows上使用TerminateProcess调用。

因此,不幸的是,我认为在这里无事可做。

Windows控制台中的CTRL-

CLOSE信号。似乎不可调整。

引用以上链接:

CTRL+CLOSE当用户关闭控制台时,系统会生成信号。控制台上连接的所有进程均会接收信号,使每个进程都有机会在终止之前进行清理。当进程收到此信号时,处理程序函数在执行任何清除操作后可以采取以下操作之一:

调用ExitProcess以终止该过程。

返回FALSE。如果没有注册的处理程序函数返回TRUE,则默认处理程序将终止该过程。

返回TRUE。在这种情况下,不会调用其他处理程序函数,并且会弹出一个对话框询问用户是否终止该过程。如果用户选择不终止该过程,则系统将不会关闭控制台,直到该过程最终终止。

UPD 。如果您可以接受本机调整,则WinAPI SetConsoleCtrlHandler函数将为您消除默认行为打下基础。

UPD2

。关于Java信号处理和终止的启示是相对较老的文章,但是“

编写Java信号处理程序” 部分可能确实包含您所需要的内容。

UPD3 。我已经尝试了以上文章中的 Java信号处理程序

。它可以SIGINT很好地工作,但不是我们需要的,所以我决定随身携带SetConsoleCtrlHandler。结果有点复杂,可能不值得在您的项目中实现。无论如何,它可以帮助其他人。

因此,想法是:

保留对关闭处理程序线程的引用。

使用JNI设置自定义本机控制台处理程序例程。

在CTRL+CLOSE信号上调用自定义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 "add"

try {

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 work

new File("d:/shutdown.mark").createNewFile();

} catch (IOException e) {

e.printStackTrace();

}

System.out.println("Shutdown");

}

}

本机replaceConsoleHandler:

JNIEXPORT 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

bat java 启动脚本_从bat脚本运行的Java应用程序上的Windows关闭挂钩相关推荐

  1. java 启动参数_网红框架SpringBoot2.x之定制参数浅析(一)

    我们都知道,SpringBoot框架最吸引人的地方之一就是他针对各种框架组件集成都提供了缺省的配置,"零配置"集成和开发是它的终极目标.理论上你不做任何特殊配置,都可以启动项目. ...

  2. java源码如何启动脚本_使用Shell脚本如何启动/停止Java的jar程序

    本文介绍如何使用Shell脚本来开启和停止jar程序的后台运行,以及如何实现out大文件的切分.另外,补充一些后台运行的小知识. 启动脚本:start_upload.sh #!/bin/sh nohu ...

  3. lr java脚本_【上海校区】 LR Java脚本编写方法

    之前在某一家银行也接触过java写的性能接口脚本,最近因项目,也需编写java接口性能测试脚本,脑袋一下懵逼了,有点不知道从何入手.随后上网查了相关资料,自己又稍微总结了一下,与大家共同分享哈~ 首先 ...

  4. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  5. 修改java启动参数_如何修改jvm启动参数

    用java命令查看. 用java -option进行修改参数. 还有tomcat,eclipse启动时通过配置文件加载的. 详细如下: 安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Ja ...

  6. 关系式调用c语言脚本_认识LoadRunner脚本语言

    LoadRunner支持多种协议,在编写脚本的时候,可以根据不同的应用,选择适合的协议.同时,可以选择Java Vuser.JavaScript Vuser.Microsoft .NET.VB Vus ...

  7. python是脚本语言、需要编译器编译执行_使用Notepad++编译运行C/C++/Python程序

    对我来说,比较常用的是C/C++/Python. 使用Notepad++编译运行单个源文件的C/C++/Python,比使用复杂的IDE更加快捷. 想要让Notepad++能够做到编译运行C/C++/ ...

  8. ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home

    我有错误 Exception in thread"main" java.lang.NoClassDefFoundError: 当我尝试在Ubuntu上运行编译类时.我使用的是一个非 ...

  9. java算术表达式_一文了解如何用 Java 进行算术表达式计算

    (给ImportNew加星标,提高Java技能) 编译:ImportNew/唐尤华 如何用Java计算"5+3"."10-40"."10*3" ...

最新文章

  1. 北京大学年度人物揭榜!发论文、搞科研,看“学神打架”!
  2. IOS开发之GCD的基本知识
  3. php myadmin怎么用,关于apachemysqlphpmyadmin的安装与配置
  4. struts+swfupload实现批量图片上传(上):swfupload
  5. matlab zeros初始化为0矩阵
  6. bzoj1588 [HNOI2002]营业额统计
  7. 技能学习重要的古语_学习方法:最重要的开发人员技能
  8. 最简单的java单例
  9. 使用hbuilder的maps模块调起百度地图导航
  10. 剪花布条(HDU-2087)
  11. Java字符串拼接“+”需要注意的问题
  12. 打线上包 测试_vue-cli项目分别打测试包(test)和生产包(prod)
  13. Altium Designer_PCB板装配图的PDF文件输出
  14. 东方时尚驾校-科目三-雪铁龙-考试技巧
  15. Android apk签名
  16. betterscroll的使用
  17. CCAI 2017 | 澳大利亚新南威尔士大学教授 Toby Walsh 将带来精彩演讲
  18. Inferior 1 (process xxx) exited with code 0177
  19. 千亿级服务器监控数据存储实践
  20. 前端基础——做相册、诗词

热门文章

  1. visudo精确用户赋权(sudo)
  2. GIS实战应用案例100篇(一)-GEE主成分分析(含代码)
  3. angularjs1访问子组件_Vue学习笔记之组件的应用
  4. 限制ul显示高度_HP Envy 34寸超宽曲屏 显示器评测
  5. 三态门三个状态vhdl_温故知新,高阻态和三态门
  6. mysql数据库迁徙_mysql数据迁徙详解
  7. mysql客户端安装错误_windows下mysql 5.7以上版本安装及遇到的问题
  8. linux 多核 系统时钟,Linux中的时间
  9. 查看oracle自动优化,使用索引查询更快,优化器为何不能自动识别
  10. 怎么写计算机教学论文,如何写好一篇关于信息技术教育的论文