单个程序实例

时间:2015-06-28 19:03:08

标签: java single-instance

我需要制作一个可以在单个实例中执行的程序。我尝试创建一个临时文件并在退出程序之前将其删除。

public static boolean isLocked() {
    File f = new File("lock.txt");
    return f.exists();
}

public static void lock() {
    String fname = "lock.txt";
    File f = new File(fname);
    try {
        f.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static void unlock() {
    File f = new File("lock.txt");
    f.delete();
}

在框架中

    private void initialize() {
    lock();
    }

    private void setFrameHandler() {
    frame.addWindowListener(new java.awt.event.WindowAdapter() {
        @Override
        public void windowClosing(java.awt.event.WindowEvent windowEvent) {
            unlock();
        }
    });
}

如果程序在紧急情况下完成(例如断电),则会出现问题。文件不会删除,并且无法运行新实例。 如何进行可靠的单实例验证?

2 个答案:

答案 0 :(得分:1)

您可以使用GetProcesses方法在启动时检查程序的另一个实例,如here所述 但这只取决于你拥有的场景(可能看不到其他用户的所有进程)

如果通过File.Open

锁定特定文件,您可以做的另一件事就是检查
File.Open ("path.lock", FileMode.OpenOrCreate, FileAccess.ReadWrite);

只要在程序中保持生成的FileStream,其他程序就无法以该模式打开文件。这基本上是Unix锁文件的工作原理。当然,你必须捕获IOException(暗示你是一个锁定的文件)。

免责声明:我没有尝试该代码,请检查我是否给了您正确的参数。

修改:您还可以查看此代码项目article,了解如何使用win32 API

使用Windows消息传递的另一种尝试已经完成here

答案 1 :(得分:0)

在一台机器上实现这一目的的一个简单方法是编写一个'PID文件',它实际上是一个包含当前正在运行的进程的操作系统ID的文件。您在开始“关键”工作时创建此项,并在成功完成后将其删除。

由于不可能使用相同的PID再次启动进程,因此您只需检查PID文件是否已存在,如果存在,则该进程是否仍在运行。