system.exit(1)は、マルチスレッドプログラムに戻るコード0で存在します
-
30-09-2019 - |
質問
電話があります System.exit(1)
私のマルチスレッドプログラムで。ただし、コード1を返す代わりに随時、プログラムは戻りコード0で終了します。他の呼び出しはありません System.exit()
そして、私はプログラムがきれいに終了しないことを確信しています。原因は何ですか、そしてどうすればそれを避けることができますか?
エラーは断続的であり、単一のスレッドプログラムで同じ動作を再現できないことに注意してください。
解決
設計を変更して、より制御されたシャットダウンを実行します。
呼び出すことを期待するべきではありません System.exit()
複数のスレッドを備えたアプリケーションでは、プログラムがきれいに終了します。
電話するのではなく System.exit()
プログラムを去るには、移動する各コンポーネントにシャットダウンメッセージを送信して使用する必要があります Thread.join()
作成したスレッドを回復するには。アプリケーションは、この方法ですべてのピースをうまくシャットダウンできるはずです。メインスレッドの最終コマンドは、出口コードを返すことです。電話するだけなら System.exit()
, 、これらのすべてのシャットダウン詳細をJVMに残しています。これは、強引なアプローチを取り、その場ですべてを殺すだけです。
使用しましたか Runtime.getRuntime.addShutdownHook()
まったく?通話 System.exit()
インストールされる可能性のあるシャットダウンフックを呼び出し、これにより出口コードが変更される可能性があります。
他のヒント
ランタイムのドキュメント。停止(int)その議論について次のように述べています。
出口の場合(同等に、
System.exit
)メソッドはすでに呼び出されており、このステータスコードは、そのメソッドに渡されたステータスコードをオーバーライドします。
だから、おそらく何かが呼び出されている Runtime.halt(int)
. 。シャットダウンフックまたはファイナルイザーで?
JVMが終了した場合にこれが起こる唯一の方法だと思います 前 System.exit(1)
実際に実行されました。あなたはあなたのシステムでこれが可能かもしれないと思いますか?
どちらも、コードです System.exit(1)
デーモンのスレッドで実行されているため、他のすべてのライブ(デーモン以外の)スレッドが仕上げられている場合、JVMはきれいに終了します(または、例外をスローすると0を出てコードを出る可能性があるため、きれいになりません!)
あるいは、 @Erick Robertsonが示唆したように、何かがフックなどから出口ステータスを変更しているのかもしれませんが、これがどのように可能かはわかりません。
注:以前のコメントを無視してください。電話 System.exit(1)
現在実行されているすべてのデーモン/非デーモンスレッドをすべて完全に終了します。