Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查单实例java程序_Java_Swing - Fatal编程技术网

检查单实例java程序

检查单实例java程序,java,swing,Java,Swing,我有一个Java程序(带有swing gui),我只希望有一个实例存在。如果它试图打开程序的另一个实例,我希望当前实例被带到前台 我该怎么做 提前感谢。图案单音: class SingleInstance { private static SingleInstance instance; public SingleInstance getInstance() { if (instance==null) instance = new SingleInstance();

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

我该怎么做

提前感谢。

图案单音:

class SingleInstance {
private static SingleInstance instance;

public SingleInstance getInstance() {
    if (instance==null)
        instance = new SingleInstance();
    return instance;
}

private SingleInstance() {
//construct it!
}
}
在C#中,通常在应用程序启动时创建一个互斥体。如果无法创建/获取它,则该应用程序的另一个实例已在运行。不幸的是,我不能100%确定这在Java中的行为是否相同,或者确切的语法是什么


希望这能有所帮助。

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

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


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

使用启动应用程序并实现。这是一本书

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


SingleInstanceListener
的方法将其连接起来。它将传递为新启动提供的任何参数。现有实例将决定如何处理新参数(例如,更改文件、添加新选项卡、忽略…)

您可以使用ShutDownHook和锁文件来完成此操作,请参见此简单示例


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

我曾经用一个套接字和一个服务器套接字这样做过:


首先,启动应用程序时,在某个端口上进行侦听,例如
4004
。诀窍是检查它是否抛出
IOException
。如果是,则可能有另一个应用程序正在运行,或者该端口被另一个应用程序使用(请注意,TCP和UDP端口没有相互阻塞),否则您可以继续启动应用程序。如果实例当前正在运行,您可能希望通过连接来通知它(这保证您的连接到达;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
}

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

@mKorbel没有必要发布任何代码,问题很清楚,而且是自包含的。Judas Imam的答案是完美的。实现单实例应用程序的替代方法:或者这回答了你的问题?在一个应用程序中使用单例并不能阻止应用程序的多个实例(即多个JVM实例);OP想要更像“计算机上只有一个实例”(Un)的东西幸运的是,Java互斥锁在进程之间不共享。@alf感谢您提供的信息-每天学习新的东西。。。这使得我的答案毫无用处,但也许还有另一个C#开发者也不知道。不一定毫无用处。想法就在那里。你只需要找到另一种方法来实现互斥。我同意。这可能是最简单的实现方法。这就是我一直在用的。启动时有一个小技巧可以绕过Windows上的文件删除错误。