单个程序实例

Single program 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();
        }
    });
}

如果程序在紧急情况下完成(例如停电),则会出现问题。文件不删除,并且 运行 一个新的实例是不可能的。 如何做靠谱的单例验证?

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

由于该进程不太可能以相同的 PID 再次启动,您可以简单地检查 PID 文件是否已经存在,如果存在,该进程是否仍然 运行。

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

您可以做的另一件事是简单地检查特定文件是否通过 File.Open

锁定
File.Open ("path.lock", FileMode.OpenOrCreate, FileAccess.ReadWrite);

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

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

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

已完成另一次使用 windows 消息传递的尝试 here