それ自体の他のインスタンスを検出して実行を防止できるアプリケーションを作成したいと考えています。これを達成するために、アプリケーション固有のポートで新しいポートを開きServerSocket
、同じポートに複数回バインドしようとするとスローされる例外に依存して、重複するアプリケーションを「検出」して強制終了することを考えています。インスタンス。現在の作業ディレクトリにファイルを書き込み、それを「検出」して同じ種類の動作を実現できることは知っていますが、実際にはこれを実行したくありません (アプリが停止して実行できない場合に何が起こるか)。ファイルを削除しませんか?)、それがServerSocket
ルートを選択した理由です。
次のコードがあるとします。
public class MyClass{
public static void main(String[] args) throws IOException{
new ServerSocket(1234);
new Thread(){
//This is a non-daemon thread. Assume its run() method never returns.
}.start();
}
}
質問
を作成するServerSocket
以外は、アプリケーションで再度使用する必要はまったくありません。その存在だけで、アプリの別のインスタンスが起動を試みたことを検出できるからです。したがって、上への参照を保存するとServerSocket
、コンパイル警告 (未使用の参照) が発生します。私はきちんとしたフリークなので、避けられるのであれば参照を保存したくありません。私の質問は、このServerSocket
インスタンスは、すべての非デーモン スレッドが終了する前にガベージ コレクションを取得しますか (アプリが失敗したり、他の方法で終了したりしないと仮定します)。