質問: スタンドアロンjavaプログラム(swing)の複数起動の抑止方法 swingでスタンドアロンのjavaプログラムを作成しています。 executable jarファイルとして、ダブルクリックにより起動するのですが、一度起動した後もう一度ダブルクリックすると同じプログラムが別に起動してしまいます。 jdk1.5、osはwindowsが対象です。 複数起動できないようにする方法はありますでしょうか? よろしくお願いします。 ※ファイルに起動フラグを書出すという方法は考えてみましたが、クラッシュ(異常終了)したときに起動不可能になるためこの方法は使用できませんでした。
回答: 私が思いつく一般的と思われる方法は2つあります。 (1)windowsのmutexを利用する方法 winapiのcreatemutex()を利用し、適当な名前のmutexを作成します。 mutex作成の成功・失敗でプログラムの二重起動を判定します。 windowsでは一般的な方法ですので情報は手に入れやすいと思います。 ただし、java以外の言語でプログラムを書く必要があります。 (2)ファイルチャネルのロックを利用する方法 あくまでjavaのみでということでしたら、ファイルチャネルのロックを利用する方法があります。 説明しにくいのでサンプルコードを書きます。(あくまでサンプルなので、実際に使う場合はよくテストしてください。) 仮にvmが異常終了した場合でもロックはおそらく開放されます。(windowsがプロセスの終了を検知するため) 万が一開放されなかった場合でも、windowsの再起動で開放されます。 -------------------------------------------------------------------------------- import java.io.file; import java.io.fileoutputstream; import java.nio.channels.filechannel; import java.nio.channels.filelock; public class sample { public static void main(string[] args) { //起動チェック final fileoutputstream fos = new fileoutputstream(new file("lock")); final filechannel fc = fos.getchannel(); final filelock lock = fc.trylock(); if (lock == null) { //既に起動されているので終了する return; } //ロック開放処理を登録 runtime.getruntime().addshutdownhook( new thread() { public void run() { if (lock != null && lock.isvalid()) { lock.release(); } fc.close(); fos.close(); } } ); //処理を続行 } } -------------------------------------------------------------------------------- それから、#1さんのソケットを使う方法には以下の問題点があります。 ・メッセージの送受信(起動チェック)とリスン開始(ロック)の処理が分離されている (タイミング次第で多重起動可能) ・起動されていない場合(正常系)と何らかのエラーで返信が返ってこない場合(異常系)の区別ができない ・返信が無いというのはタイムアウトになるということであり、起動時間が多少長くなる 個人用のツールならともかく、業務システムに使用するのはお勧めできません。 #念の為に書いておきますが、回答を批判しているわけではありません。