3

Javaアプリが閉じたとき-シャットダウンフックが最後まで完全に実行されません。
Javaドキュメントではそれはそれを述べています

シャットダウンフックもすぐに作業を終了する必要があります...

(ドキュメントを参照)アプリをすばやく閉じます。
私はそれを試して解決したい(多分それを非デーモンスレッドに設定する)

そこで、まずは簡単なアプリで再構築してみました。
を使用してフックを追加します

    Runtime.getRuntime().addShutdownHook(new Thread(){
        @Override public void run() {
            for (int i = 0; i < 1000000; i++) {
                System.out.println(i);
            }

        }
    });

そして私は投げます

            System.exit(1);

この例では、シャットダウンプロセスは問題なく終了するまでカウントされます。(したがって、再構築はありません)

アプリで修正するにはどうすればよいですか?
どうすれば再構築できますか?

4

2 に答える 2

3

javadoc は推奨事項を提供しています。JVM がダウンしている場合、フックは数分間実行されず、さまざまなことを行っているはずです。これらは、プログラム後にクリーンアップするように設計されています。

フック スレッドは開始さjoin()れてから呼び出されるため、JVMは停止する前に常にそれらが完了するのを待ちます。からのコードは次のApplicationShutdownHooks.runHooks()とおりです。

static void runHooks() {
    ...
    for (Thread hook : threads) {
        hook.start();
    }
    for (Thread hook : threads) {
        hook.join();
    }
}

つまり、 を呼び出すSystem.exit(1);と、JVM はすぐに終了します。

于 2012-08-21T14:27:30.530 に答える
1

アプリケーションをコンテナで実行していますか? 停止/シャットダウンを開始すると、タイムアウト後にコンテナが JVM を強制終了している可能性があります。通常の状況では、シャットダウン フックはすべて終了するはずであり、このようにして JVM のシャットダウン時間を遅らせますが、まれに、仮想マシンが異常終了する場合があります。これは、仮想マシンが外部で終了した場合に発生します。たとえば、Unix の SIGKILL シグナルや Microsoft Windows の TerminateProcess 呼び出しによって発生します。たとえば、内部データ構造が破損したり、存在しないメモリにアクセスしようとしたりして、ネイティブ メソッドが失敗した場合にも、仮想マシンは中止される可能性があります。仮想マシンが異常終了した場合、シャットダウン フックが実行されるかどうかは保証されません。

于 2012-08-21T14:38:22.683 に答える