重複の可能性:
単一インスタンスの Java アプリケーションを実装するには?
Java アプリケーションのインスタンスを 1 つだけ実行して、プロセスを 1 つだけにする方法はありますか? . Javaでそれを行うことは可能ですか?
重複の可能性:
単一インスタンスの Java アプリケーションを実装するには?
Java アプリケーションのインスタンスを 1 つだけ実行して、プロセスを 1 つだけにする方法はありますか? . Javaでそれを行うことは可能ですか?
1 つのインスタンスを持つ簡単な方法は、サービス ポートを使用することです。
ServerSocket ss = new ServerSocket(MY_PORT);
ファイルをロックする代わりにこのアプローチを使用する利点は、既に実行されているインスタンスと通信し、インスタンスが機能していることを確認できることです。たとえば、サーバーソケットを開始できない場合は、プレーンソケットを使用して、「ファイルを開いてください」などのメッセージを送信します
これを行う最も簡単な方法は、ファイルが存在しない場合、アプリケーションの起動時にディスク上にロック ファイルを作成することです。ファイルが存在する場合は、アプリケーションの別のインスタンスが実行中であると想定して、メッセージを表示して終了できます。あなたの質問を正しく理解したと仮定します。
「アプリケーションのインスタンスを 1 つ実行する」という意味であれば、ロック ファイルを使用してそれを実現できます。アプリケーションの起動時にファイルを作成し、プログラムの終了時にそれを削除します。起動時に、ロックファイルがあるかどうかを確認します。ファイルが存在する場合は、アプリケーションの別のインスタンスが既に実行されているため、終了します。
起動時にソケットを開くことができます。ソケットが使用中の場合は、アプリのインスタンスが既に実行されている可能性があります。ロック ファイルは機能しますが、ロック ファイルを削除せずにアプリがクラッシュした場合は、アプリを再起動する前にファイルを手動で削除する必要があります。
シングルトンパターンを適用できます
Following are the ways to do it:
1.プライベートコンストラクターと同期メソッド
public class MyClass{
private static MyClass unique_instance;
private MyClass(){
// Initialize the state of the object here
}
public static synchronized MyClass getInstance(){
if (unique_instance == null){
unique_instance = new MyClass();
}
return unique_instance;
}
}
2.プライベートコンストラクターと宣言中の静的インスタンスの初期化
public class MyClass{
private static MyClass unique_instance = new MyClass() ;
private MyClass(){
// Initialize the state of the object here
}
public static MyClass getInstance(){
return unique_instance;
}
}
3.ロックを再確認します
public class MyClass{
private static MyClass unique_instance;
private MyClass(){
// Initialize the state of the object here
}
public static MyClass getInstance(){
if (unique_instance == null)
synchronized(this){
if (unique_instance == null){
unique_instance = new MyClass();
}
}
return unique_instance;
}
}
You can also implement a class with
シングルトンパターンを適用するための静的メソッドと静的変数。ただし、お勧めしません。