使用空文件来拥有一个应用程序实例

时间:2010-07-28 21:48:02

标签: java swing file single-instance

可能有其他方法可以做到这一点,但我想使用一个空文件让一个应用程序的实例在给定时间运行。这可以通过在启动应用程序时创建文件并在检测到文件后立即退出其他应用程序实例来完成。

这种方法的问题在于,如果应用程序意外停止并且ShutDownhook被证明不可靠,则文件可以保留。

你将如何按预期进行这项工作?

6 个答案:

答案 0 :(得分:2)

绑定到高编号的端口,但不要听。两个程序无法绑定到同一台计算机上的同一TCP端口。非常跨平台,但仍然有点像kludge。

答案 1 :(得分:1)

使用独占锁创建文件并保持打开(即,不要传递FILE_SHARE_READ等)。当第二个实例启动时,它会尝试打开文件,如果失败则意味着第一个实例仍在运行。

如果第一次崩溃,那么Windows将自动关闭所有文件句柄,因此第二个进程将出现,看到该文件在那里但是因为它可以打开它然后它知道第一个已经崩溃(这种技术也可能是用于一个特殊的对话框,“我看到此应用程序的上一个实例崩溃了,你想恢复你的上一次会话吗?”或其他东西)

答案 2 :(得分:1)

你总是可以将Java程序包装在另一个程序中(不需要复杂 - 甚至可能是一个shell脚本)来检测异常退出并删除文件。 e.g。

if(!`java MyProgram`){
    rm lockFile
}

答案 3 :(得分:1)

这可能有点多了。但是你可以启动一个ServerSocket并绑定到每个应用程序都知道的任意端口。如果端口可用,应用程序将获胜以启动,如果不是,则抛出绑定异常并且应用程序正常停止。

答案 4 :(得分:1)

使用文件可能有更好的方法,但使用该方法可以为文件写入时间戳,并使用Timer定期更新。然后,当您的程序启动时,它可以将文件中的时间戳与当前时间进行比较,如果距离太近则退出。这可以保证您的程序无论如何终止都可以重新启动。

答案 5 :(得分:0)

假设在应用程序退出时将释放锁定并在启动时删除文件就可以了。请参阅以下链接。

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

P.S:我在应用程序退出时尝试使用delete,但似乎失败了。