第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 JNI 運行時,Java ShutdownHook 無法加入主線程

從 JNI 運行時,Java ShutdownHook 無法加入主線程

慕田峪9158850 2021-11-11 14:05:54
我有一些 Java 代碼來創(chuàng)建關(guān)閉掛鉤,以便在客戶端按下 ctrl+C 時干凈地退出:private static void shutdownHandler(Thread mainThread) {    try {        mainThread.join(30000);    } catch (InterruptedException e) {    }}public static void main(String[] args) {    final Thread mainThread = Thread.currentThread();    Thread shutdownThread = new Thread(() -> shutdownHandler(mainThread));    Runtime.getRuntime().addShutdownHook(shutdownThread);}當我從命令行運行它時,它按預期工作(主線程退出并幾乎立即返回到命令提示符)。但是,如果我編寫一個 JNI 包裝器,使用以下 C++ 代碼調(diào)用它:JavaVMInitArgs vm_args;// Populate vm_argsJavaVM *jvm;JNIEnv *env;JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &vm_args);jclass mainClass = env->FindClass("path/to/my/class");jmethod mainMethod = env->GetStaticMethodID(mainClass, "main", "([L" STRING_CLASS ";)V");jclass stringClass = env->FindClass(STRING_CLASS);jobjectArray mainArgs = env->NewObjectArray(0, stringClass, NULL);env->CallStaticVoidMethod(mainClass, mainMethod, mainArgs);jvm->DestroyJavaVM();然后該shutdownHandler方法掛起,直到 30 秒超時過去,然后將控制權(quán)返回給 C++ 代碼并最終退出。有沒有人知道shutdownHandler從 JNI 調(diào)用開始時允許方法加入主線程的方法?
查看完整描述

1 回答

?
慕勒3428872

TA貢獻1848條經(jīng)驗 獲得超6個贊

在您的第一個示例中,主線程退出,然后 JVM 檢測到?jīng)]有剩余的非守護進程線程并將啟動 JVM 關(guān)閉。此時,加入主線程沒有問題,因為它甚至在關(guān)閉之前就已經(jīng)結(jié)束了。

在您的第二個變體中,主線程,即main通過執(zhí)行方法的線程env -> CallStaticVoidMethod(…)正忙于執(zhí)行jvm -> DestroyJavaVM()。由于該函數(shù)等待關(guān)閉處理程序的完成而您的關(guān)閉處理程序等待該線程的完成,因此您會遇到死鎖。

您也可以使用純 Java 代碼獲得類似的行為。當您放置System.exit(0);main方法的末尾,讓主線程啟動關(guān)閉并等待其完成時,您會遇到類似的死鎖。

通常,您不應join在關(guān)閉處理程序中執(zhí)行操作。這些處理程序應該盡快清理并返回。

或者,正如文檔所說:

關(guān)閉鉤子在虛擬機生命周期的一個微妙時刻運行,因此應該進行防御性編碼。特別是,它們應該被編寫為線程安全的,并盡可能避免死鎖。他們也不應該盲目依賴可能已經(jīng)注冊了自己的關(guān)閉鉤子的服務,因此他們自己可能會在關(guān)閉過程中。例如,嘗試使用其他基于線程的服務(例如 AWT 事件分派線程)可能會導致死鎖。


查看完整回答
反對 回復 2021-11-11
  • 1 回答
  • 0 關(guān)注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號