2

これを行うにはおそらく他の方法がありますが、空のファイルを使用して、特定の時間にアプリケーションのインスタンスを 1 つ実行したいと考えています。これは、アプリケーションの起動時にファイルを作成し、他のアプリケーション インスタンスがファイルを検出するとすぐに終了することによって行われます。

このアプローチの問題点は、アプリケーションが予期せず停止し、ShutDownhook が信頼できないことが判明した場合にファイルが残る可能性があることです。

これを意図したとおりに機能させるにはどうすればよいでしょうか。

4

6 に答える 6

2

大きい番号のポートにバインドしますが、リッスンしません。2 つのプログラムを同じマシン上の同じ TCP ポートにバインドすることはできません。非常にクロスプラットフォームですが、それでもやや面倒です。

于 2010-07-28T22:00:27.563 に答える
1

There is probably a better way to do this than using a file but with that approach you could write a timestamp to the file and update it at regular intervals using a Timer. Then when your program starts it could compare the timestamp in the file with the current time and quit if it is too close. This guarantees that your program will be able to restart no matter how it was terminated.

于 2010-07-29T09:24:01.413 に答える
1

ファイルを作成し、排他ロック (つまり、 を渡さないなど)で開いたままにします。FILE_SHARE_READ2 番目のインスタンスが起動すると、ファイルを開こうとします。失敗した場合は、最初のインスタンスがまだ実行中であることを意味します。

最初のプロセスがクラッシュした場合、Windows は自動的にすべてのファイル ハンドルを閉じるため、2 番目のプロセスが開始されます。ファイルがそこにあることを確認しますが、ファイルを開くことができるため、最初のプロセスがクラッシュしたことを認識します (この手法は、特別なダイアログ、「このアプリケーションの以前のインスタンスがクラッシュしました。最後のセッションを復元しますか?」など)

于 2010-07-28T21:54:01.010 に答える
1

異常終了を検出してファイルを削除する別のプログラム (複雑である必要はありません。シェル スクリプトであってもかまいません) で Java プログラムをいつでもラップできます。例えば

if(!`java MyProgram`){
    rm lockFile
}
于 2010-07-28T21:56:32.547 に答える
1

これは少し多いかもしれません。ただし、ServerSocket を開始して、各アプリケーションが認識している任意のポートにバインドできます。ポートが使用可能な場合、アプリケーションは起動に成功し、そうでない場合はバインディング例外がスローされ、アプリケーションは正常に停止します。

于 2010-07-28T22:01:02.707 に答える
0

アプリケーションが終了するとロックが解除されると仮定し、起動時にファイルを削除するとうまくいきます。以下のリンクを参照してください。

http://jimlife.wordpress.com/2008/07/21/java-application-make-sure-only-singleone-instance-running-with-file-lock-ampampampampamp-shutdownhook/

PS: アプリケーションの終了時に使用しようとしましdeleteたが、失敗するようです。

于 2010-07-29T21:47:50.210 に答える