2011-01-12 3 views
4

私は、System.exit(0)を呼び出すメソッドを呼び出す終了ボタンを持つスイングアプリケーションを持っています。 JVMは何らかの理由でシャットダウンしません。誰でもJVMを実行し続ける原因を知っていますか?スイングアプリケーションの終了後にJVMがシャットダウンしない

+0

終了時にデーモン以外のスレッドが実行されていますか? –

+0

[何がSystem.exit()の後にJavaを実行し続ける可能性がありますか?](http://stackoverflow.com/questions/2614774/what-c​​an-cause-java-to-keep-running-after-system -exit) –

答えて

5

非デーモンスレッドでは、System.exit()(とデーモンスレッドは確かにそうではありません)を呼び出すと、プログラムが終了しないようにしますが、シャットダウンフック†は、終了に失敗した場合に実行されます。

† Design of the Shutdown Hooks APIを参照してください(最初にリンクされた記事は現在the wayback machineでのみ利用可能です)。

スイングはおそらくシャットダウンフックを使用しますが、プログラムの終了を妨げるような方法ではありません。しかし、あなた(またはあなたが使っているライブラリ)がRuntime.addShutdownHook()を呼び出す場合は、シャットダウンフックがデッドロックしないようにしてください。

ところで、この問題の回避策の1つは、シャットダウンフックを追加して、60秒待ってからRuntime.halt()を呼び出す別のスレッドを停止させることです。 (そうでなければ、シャットダウンフックは60秒待ってからプログラムが60秒間終了するのを防ぐため、別のスレッドをスピンオフする必要があります)。

2

スレッドがまだ実行されている可能性がありますか?

実行中のスレッドと実行中のスレッドを見つけるのは簡単です。 Netbeansでは、プロファイルモード(Alt + F2)でプロジェクトを開始し、リアルタイムでスナップショットを作成します。 (プロファイラ - >表示 - >スレッド)

+2

また、SunのJVMに付属するJVisualVMまたはその前身JConsoleを使用することもできます。特にJConsoleには、スレッドタブの下部に便利な「デッドロック検出」ボタンがあります。 –

+0

「デッドロックの検出」ボタンについてはわかりませんでした。時には役に立つかもしれません!ありがとう! –

関連する問題