2009-07-16 7 views
5

ユーザーがコマンドラインからプログラムを起動してプロセスを終了するときに必要です(ctrl + cなど)すべての接続を閉じることによって、プログラムは正常に終了します。これも可能ですか? GUIのように閉じるときにメソッドを呼び出させることはできません。このプログラムにはGUIはありません。JAVA:プロセスが停止したときにメソッドを呼び出す方法(それは可能ですか?)

お知らせください。

+0

ただ、これは重複質問のように見える気づい:http://stackoverflow.com/questions/264825/get-notification-on-a-java-process-termination/264833 –

答えて

8

Here is a pretty good guide to signal handling in Java。これは、Ctrl + Cを含むシャットダウンと終了のケースもカバーしています。

実行する必要がある特定のコールは、addShutdownHookです。

処理できない特定のケースがあります...通常はです。 OSは、自分自身を保存する機会を与えずに、アプリケーションをただちに終了します。このメカニズムによって、すべてのケースをカバーすることはできません。 JavaDocを引用するには

まれに、仮想マシンが正常にシャットダウンせずに実行を中止する、つまり停止することがあります。これは、仮想マシンが外部で終了した場合、たとえばUnixではSIGKILLシグナル、Microsoft WindowsではTerminateProcessコールで発生します。たとえば、内部データ構造が壊れたり、存在しないメモリにアクセスしようとしたりするなどして、ネイティブメソッドが失敗した場合、仮想マシンは中止されることもあります。仮想マシンが異常終了した場合、シャットダウンフックが実行されるかどうかは保証されません。

+1

それはおそらく明らかだが、それでも私は感じますプロセスが強制終了された場合(UnixではSIGKILL、Windowsでは 'taskkill/f')、それが事実を検出するか何かを行う方法がないことを指摘する義務があります。それはちょうどすぐそこで死んでしまい、それが中断されない睡眠でなければ(もしそうであれば、それがその状態を離れるとすぐに死ぬでしょう)。 –

+0

良い点;私はそれを含めるように更新しました。 –

+0

もちろん、Oracleの「シャットダウン中止」のような機能です。これを克服することはユーザー権利の取り消しに似ているため、IMOは援助することはできません。 –