4

System.exit(1)マルチスレッドプログラムで呼び出しがあります。ただし、リターン コード 1 の代わりに、プログラムがリターン コード 0 で終了することがあります。他に呼び出しはSystem.exit()ありません。プログラムが正常に終了しないことは確かです。何が原因で、どうすれば回避できますか?

エラーは断続的であり、シングル スレッド プログラムで同じ動作を再現できないことに注意してください。

4

3 に答える 3

4

設計を変更して、より制御されたシャットダウンを実行します。

System.exit()複数のスレッドを使用してアプリケーションを呼び出すと、プログラムが正常に終了することは期待できません。

プログラムを終了するために呼び出すのではなく、System.exit()移動中の各コンポーネントにシャットダウン メッセージを送信し、Thread.join()作成したスレッドを回復するために使用する必要があります。このようにして、アプリケーションはすべての部分を適切にシャットダウンできるはずです。メイン スレッドの最後のコマンドは、終了コードを返すことです。を呼び出すだけではSystem.exit()、これらのシャットダウンの詳細をすべて JVM に任せることになります。

Runtime.getRuntime.addShutdownHook()まったく使ったことがありますか?を呼び出すと、インストールされているシャットダウン フックが呼び出されSystem.exit()、終了コードが変更される可能性があります。

于 2011-01-07T13:13:26.950 に答える
1

ランタイムのドキュメント。停止(int) は、その引数について次のように述べています。

exit (同等にSystem.exit) メソッドがすでに呼び出されている場合、このステータス コードは、そのメソッドに渡されたステータス コードをオーバーライドします。

おそらく何かが を呼び出してRuntime.halt(int)います。シャットダウンフックまたはファイナライザーで?

于 2011-01-07T13:29:49.050 に答える
0

JVMが実際に実行される に終了した場合にこれが発生する唯一の方法だと思います。System.exit(1)これはあなたのシステムで可能だと思いますか?

のコードSystem.exit(1)はデーモンスレッドで実行されているため、他のすべてのライブ (非デーモン) スレッドが動作を終了すると、JVM は正常に終了します (または、プログラムが例外をスローした場合でも 0 の終了コードを取得できるため、正常に終了しません! )

または、@Erick Robertson が示唆したように、フックなどから終了ステータスを変更している可能性がありますが、これがどのように可能かはわかりません。

注:私の前のコメントは無視してください。を呼び出すSystem.exit(1)と、現在実行中のすべてのデーモン/非デーモン スレッドがまとめて終了します。

于 2011-01-07T13:27:20.007 に答える