2009-04-07 8 views
1

私はJavaプログラムからプロセスを開始しています。私はそれを保持し、プログラムの後の時点で、このプロセスを終了させる適切な方法である自分自身をきれいにしてシャットダウンするように、いくつかのシグナルを送ることができます(UNIXシグナルのように - 別のメカニズム)。私は後で再起動してプロセスを保持し、任意の回数繰り返し停止することができます。開いたプロセスをJavaでクリーンアップするにはどうすればよいですか?

私のプログラムが存在する場合は、そのプロセスが終了することを知らせ、それが存在することを確認したいと思います。さもなければ、Javaはプロセスを非同期的に起動するので、プログラムが終了した後も永続的に実行され続けます。

私はプロセス変数を含むオブジェクトのデストラクタでこれを行うと思ったが、Javaにはデストラクタがないようだ。 JNIで割り当てられたメモリを解放するためのfinalize()メソッドがありますが、これはそうではなく、finalize()が呼び出されることは保証できません。オブジェクトがガベージコレクションされたときのみ呼び出されます。プログラムはガベージコレクションを呼び出さずに終了まで実行することができます。この場合、すべてが一度に解放され、ガベージコレクションやfinalize()は発生しません。

私のプログラムがこのクリーンアップコードを終了したときに、最初に呼び出されることを確認する最良の方法は何ですか?

私はJava 1.6がRuntime.addShutdownHook()メソッドを導入したのを見ていますが、現在はJava 1.5に固執しています。

+0

[Javaのデストラクタはありますか?](http://stackoverflow.com/questions/171952/is-there-a-destructor-for-java) – Raedwald

答えて

3

try/finallyは、C++デストラクタとの親和性に最も近いものです。また

Process process; 

process = ....; 

try 
{ 
    // do work 
} 
finally 
{ 
    // send info to process to shut it down 
} 

addShutdownHook was added in 1.3 ...

+0

try/finallyはここでは機能しません。私のプログラムはその線形のどこにもありません。プロセスを開始したメソッドでは、クリーンアップコードは決して起こりません。これは、ユーザーがプログラムを終了したときに発生する必要があり、私はそれがいつあるかわかりません。しかし、 - – skiphoppy

+0

1.3でaddShutdownHook()が入ってきたことを指摘して、私が欲しいものを私に与えてくれました。 (そして、StackOverflowの答えで読んだものがすべて正しいと仮定しないように教えています...私はここで別の質問から1.6フィギュアを選んだのです。)ありがとう!! – skiphoppy

+0

あなたはtry/finallyをおそらく動作させることができます - それはちょっとしたことかもしれませんが、あなたがそれを理解してうれしいです。 – TofuBeer

1

なぜないでSystem.exitを呼び出して、あなたの前にそれを呼び出しますか?あなたのコードはおそらくSystem.exitを1つの場所から呼び出す(またはメインから返す)ように構造化されていなければなりません。

+0

私はそのようにコードを構造化したいと思っていますが、私はできないと思います。ユーザはXボタンをクリックすることができ、ユーザは「終了」ボタンをクリックすることができ、ユーザはオペレーティングシステム機能を使用してプログラムを強制終了することができる。 – skiphoppy

+0

これらすべての場所でSystem.exit()を使用すると、最初にリソースをクローズして終了する静的な.exitルーチンを簡単に呼び出すことができませんでしたか? –

関連する問題