System.exit(1)
マルチスレッドプログラムで呼び出しがあります。ただし、リターン コード 1 の代わりに、プログラムがリターン コード 0 で終了することがあります。他に呼び出しはSystem.exit()
ありません。プログラムが正常に終了しないことは確かです。何が原因で、どうすれば回避できますか?
エラーは断続的であり、シングル スレッド プログラムで同じ動作を再現できないことに注意してください。
System.exit(1)
マルチスレッドプログラムで呼び出しがあります。ただし、リターン コード 1 の代わりに、プログラムがリターン コード 0 で終了することがあります。他に呼び出しはSystem.exit()
ありません。プログラムが正常に終了しないことは確かです。何が原因で、どうすれば回避できますか?
エラーは断続的であり、シングル スレッド プログラムで同じ動作を再現できないことに注意してください。
設計を変更して、より制御されたシャットダウンを実行します。
System.exit()
複数のスレッドを使用してアプリケーションを呼び出すと、プログラムが正常に終了することは期待できません。
プログラムを終了するために呼び出すのではなく、System.exit()
移動中の各コンポーネントにシャットダウン メッセージを送信し、Thread.join()
作成したスレッドを回復するために使用する必要があります。このようにして、アプリケーションはすべての部分を適切にシャットダウンできるはずです。メイン スレッドの最後のコマンドは、終了コードを返すことです。を呼び出すだけではSystem.exit()
、これらのシャットダウンの詳細をすべて JVM に任せることになります。
Runtime.getRuntime.addShutdownHook()
まったく使ったことがありますか?を呼び出すと、インストールされているシャットダウン フックが呼び出されSystem.exit()
、終了コードが変更される可能性があります。
ランタイムのドキュメント。停止(int) は、その引数について次のように述べています。
exit (同等に
System.exit
) メソッドがすでに呼び出されている場合、このステータス コードは、そのメソッドに渡されたステータス コードをオーバーライドします。
おそらく何かが を呼び出してRuntime.halt(int)
います。シャットダウンフックまたはファイナライザーで?
JVMが実際に実行される前 に終了した場合にこれが発生する唯一の方法だと思います。System.exit(1)
これはあなたのシステムで可能だと思いますか?
のコードSystem.exit(1)
はデーモンスレッドで実行されているため、他のすべてのライブ (非デーモン) スレッドが動作を終了すると、JVM は正常に終了します (または、プログラムが例外をスローした場合でも 0 の終了コードを取得できるため、正常に終了しません! )
または、@Erick Robertson が示唆したように、フックなどから終了ステータスを変更している可能性がありますが、これがどのように可能かはわかりません。
注:私の前のコメントは無視してください。を呼び出すSystem.exit(1)
と、現在実行中のすべてのデーモン/非デーモン スレッドがまとめて終了します。