日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2023/12/1 windows 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bat java 启动脚本_从bat脚本运行的Java应用程序上的Windows关闭挂钩 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

小編典典

在極少數情況下,虛擬機可能會中止,即在不完全關閉的情況下停止運行。當虛擬機在外部終止時會發生這種情況,例如在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关闭挂钩的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。