まず、簡単な答え:プロセスがデッドロックします。
にSystem.exitはthis code blockで終わるShutdown.exit
を、呼び出し巻き取る:
synchronized (Shutdown.class) {
/* Synchronize on the class object, causing any other thread
* that attempts to initiate shutdown to stall indefinitely
*/
sequence();
halt(status);
}
コメントが完全に正確です。しかしこれを理解するためには、シャットダウンフックが何をするのかを正確に把握する必要があります。
this answer hereで説明されているように、シャットダウンフックがApplicationShutdownHooks.add
で追加されます。これらのフックはない、アプリケーションのシャットダウンフックであることに注意してください、まず
if (hook != null) hook.run();
:最終的には上記のsequence
方法はShutdown.runHooks
にthis line of codeに巻き取ることに注意してください。これらはシステムのシャットダウンフックで、異なるものがあります。そのうちの1つは、アプリケーションのシャットダウンフックの実行を確実にする責任があります。 はで、はではありません。換言すれば、ブロックである。これらのシャットダウンフックの1つは、すべてのアプリケーションシャットダウンフック(自分自身またはリンクされた回答でこのコードをトレースすることができます)を同時に開始し、Thread.join
コールを使用してすべて完了するまでブロックします。そのうちの1つは、アプリケーションシャットダウンフックです。System.exit
を呼び出した場合、ロックを得るまでには、Shutdown.class
が永久に取得されます。
次に、ダムの答え:代わりにRuntime.getRuntime().halt()
を呼び出してください。私は "ダムの答え"と言っています。これはおそらく、あなたが出口の代わりにやってほしいと思っていたわずかに低いレベルのものだからです。 System.exit
がクリーンシャットダウンに失敗した場合、halt
はハードシャットダウンであり、常に即座に成功します。
次に、スマートな回答:おそらく何もありません。次の理由から、シャットダウンフックを終了させてください。シャットダウンフックはシャットダウンを所有していません。特に、シャットダウンフックが必要な場合があります。逆に、私はこのフックの責任の1つが最終的にハードシャットダウンを強制することであると考えます。私はすぐに遅れた仕事としてそれを作成することをお勧めします。
@libikなぜですか?それは知識を共有するために実際に励まされます。実際には、具体的には「自分の質問に答える」というチェックボックスがあります。 – Doorknob
これはいい答えです。 upvoteの価値がある。 – Bathsheba
さて、実際に質問をしている限り、あなた自身や他の人の助けを借りてそれを理解してください...誰かが何らかの反応を出す前に質問と回答をしないでください。 – libik