检查单实例java程序

我有一个Java程序(带有一个swing gui),我想只有一个实例存在。 如果它试图打开另一个程序实例,我希望将当前实例带到前台。

我该怎么做呢?

提前致谢。

使用Java Web Start启动应用程序并实现JNLP API的SingleInstanceService 。 这是一个演示。 SingleInstanceService

如果它试图打开另一个程序实例,我希望将当前实例带到前台。

将它挂钩在SingleInstanceListener的newActivation(String [])方法中。 它将传递为新发布提供的任何参数。 现有实例决定如何处理新的args(例如,更改文件,添加新选项卡,忽略..)

您可以使用ShutDownHook和锁定文件来执行此操作,请参阅此简单示例 。

我认为这是最简单的方式……

Java中没有prev-instance,但您可以在temp(或/ var / run)目录中创建pid文件。 (并在退出时将其设为File.deleteOnExit()以清除它)

要将现有窗口置于顶部,您可以自己通过命名管道,unix套接字或java远程方法调用等通知程序。简单而肮脏的方法是写入一个小文件,比如$TEMP/foobar-app.bring-to-top ,程序应定期轮询这个小文件,如果它存在,请将窗口置于顶部并删除此小文件。

我猜Java无法处理信号,即kill -HUP PID可能不适用于Java应用程序。 即使可能,也不是每个操作系统都有信号。

我用Socket和ServerSocket做了一次:


首先,当您启动应用程序时,请在某个端口上进行ServerSocket侦听,例如4004 。 诀窍是检查它是否抛出IOException 。 如果是,则运行另一个应用程序或另一个应用程序使用该端口( 检查此列表中常用端口 ;请注意,TCP和UDP端口不会相互阻塞),否则您可以继续启动应用程序。 如果某个实例当前正在运行,您可能希望通过连接TCP套接字来通知它(这可以保证您的连接到达; UDP不会)。

这是一个例子:

 ServerSocket ss = null; try { ss = new ServerSocket(4004); } catch (IOException ex0) { // Port either occupied by your application or a foreign one // -> Connect Socket s = null; try { s = new Socket(); } catch (Exception ex1) { // Something went wrong } if (s != null) { // Send some singnal } } if (ss == null) { // Close or do something else } 

(我记忆中写道,所以有些事情可能是错的,或者可能做得更好)。

在C#中,您通常会在Applicaiton启动时创建一个Mutex 。 如果您无法创建/获取它,则该应用程序的另一个实例已在运行。 不幸的是,我不是100%确定在Java中的行为是否相同或者确切的语法是什么。

希望这可以帮助。

模式单音:

 class SingleInstance { private static SingleInstance instance; public SingleInstance getInstance() { if (instance==null) instance = new SingleInstance(); return instance; } private SingleInstance() { //construct it! } }