2010-07-28 31 views
2

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

这种方法的问题是,如果应用程序意外停止和ShutDownhook被证明是不可靠的文件可以保持。

你怎么会去使这项工作按照预期?

回答

2

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

+0

非常聪明。我必须记住那个技巧。 – 2010-07-28 22:03:15

1

创建文件和保持打开与排他锁(即,不通过FILE_SHARE_READ等)。当第二个实例启动时,它会尝试打开文件,如果失败,则意味着第一个文件仍在运行。

如果第一次崩溃,那么Windows将自动关闭所有文件句柄,因此第二个进程将会出现,请参阅该文件在那里,但由于它可以打开它,因此它知道第一个文件已经崩溃(此技术也可以可用于专门的对话,“我看到这个应用程序崩溃的前一个实例,你想恢复你的最后一次会议?”什么的)

+0

这可能不是一个跨平台的解决方案。请参阅:http://www.devx.com/Java/Article/7870 – 2010-07-29 11:12:24

1

你总是可以在另一个程序包Java程序(不需要很复杂 - 甚至可能是一个shell脚本),它会检测到异常退出并删除文件。例如

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

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

1

有可能是一个更好的方式来做到这一点比使用一个文件,但这种做法你可以写一个时间戳的文件,并使用一个计时器定期更新。然后当你的程序启动时,它可以比较文件中的时间戳和当前时间,如果它太接近,就退出。这可以确保您的程序无论终止方式如何都能够重新启动。

相关问题