2017-02-09 6 views
7

私のアプリケーションの結果に応じてJVMリターンコードを変更する必要があります。シャットダウンフックでリターンコードを取得する方法

しかし、System.exit(コード)を明示的に呼び出すことは危険です。アプリケーションが複雑で、実行中のスレッドの終了を特定するのは難しいです。

私はシャットダウン・フックを使用して、JVMを終了する前に戻りコードを変更します。

しかし、それはエラーコードではありません0

+0

メインスレッドの元の終了コードを知る方法。 -1にする必要がありますが、シャットダウンフックで1に設定します。 –

+0

アプリケーションの結果にコードベースを設定したいので、元の終了コードで何をしたいかを指定します。 – ravthiru

+0

元のコードはエラーコードであり、エラーコードを変更しないでください。 –

答えて

5

かもしれだってどのように私はJVMの元リターンコードを取得することができますあなたはSystem.exit(status)が内部でどの意志Runtime.getRuntime().exit(status);を呼び出し、シャットダウンフックでexitメソッドを呼び出すべきではないという問題がありますアプリケーションが無期限にブロックされる可能性があります。 JavaDoc

あたりとして

シャットダウンフックが無期限にブロックします この方法を実行している場合、仮想マシンは、その シャットダウンシーケンスを開始した後に、このメソッドが呼び出された場合。

statusへのアクセス権はありません。すべてのシャットダウンフックが呼び出された後でも変更される可能性があります。

1

シャットダウンフックと終了ステータスが互換性がないため、メインメソッドで捕捉される機能のみを持つThrowableを作成できます。その後、キャッチブロックがシャットダウンブロックになります。そこでは、System.exit()を呼び出して、必要に応じてシャットダウンコードを保持することもできます。

class Emergency extends Throwable{ 
    int exit = 0; 
} 

public final class Entry { 

    public static void main(String[] args){ 
      try { 
       throw new Emergency(); 
      } catch (Emergency e) { 
       // Shut down the app 

      } 
    } 

} 
+0

間に例外をキャッチしてログに記録するメカニズムがある場合、失敗する可能性があります。 –

+0

'例外 'ではなく' Throwable'を直接拡張するとうまくいくと思います。 –

+0

Throwableはほとんど捕捉されないので、拡張する必要があります。私は秒で小さなスニペットを投稿します – efekctive

関連する問題