java - 如果应用程序崩溃,JUnique 锁定的应用程序不会运行

标签 java multithreading swing uncaughtexceptionhandler

我正在开发 Java 应用程序。我想阻止用户同时运行同一 Java 应用程序的多个实例。我为 Java 使用了 JUnique 应用程序锁定库,效果很好。但是当它崩溃时有一个严重的问题。

应用程序崩溃无法启动,只是返回AlreadyLockedException。我用来锁定我的应用程序的代码如下。

public static boolean isRunning() {
    boolean alreadyRunning = false;
    try {
        JUnique.acquireLock(appId);
        alreadyRunning = false;
    } catch (AlreadyLockedException e) {
        logger.error("Unable to acquire lock. There is an instance already running");
        alreadyRunning = true;
    } catch (Throwable t) {
        logger.error("Unable to acquire lock. ", t);
    }
    return alreadyRunning;
}

释放我的锁的代码是:

public static void release() {
    try {
        JUnique.releaseLock(appId);
    } catch (Throwable t) {
        logger.error("Error releasing the lock", t);
    }
}

我可以使用 release() 方法来处理预期的崩溃。但真正的问题出现在应用程序在运行时意外崩溃时。应用程序在未释放应用程序获取的锁的情况下终止。

如果应用程序意外崩溃,我们如何释放 JUnique 锁?

最佳答案

这是 JUnique 的设计缺陷(我发现的最后一个版本 here)。根本不支持计算机崩溃的用例(BSOD、电源中断)。假定始终执行 ShutdownHook(删除锁,参见 JUnique.java)。该缺陷在 releaseLock api-docs 中很明显:

“请注意,锁只能由先前获取它的同一个 JVM 释放。如果给定的 ID 不对应于属于当前 JVM 的锁,则不会采取任何操作。”

但是没有方法forceReleaseLock(String id)这反过来意味着在计算机崩溃后,应用程序将无法再启动。

在这种情况下,通常会向用户显示一个对话框,其中包含一条消息“应用程序已在运行”和一个显示正在运行的应用程序窗口的“确定”按钮。在这种情况下,您可以添加一个按钮“不,它不是”,并在单击时:

  • 检查应用程序是否没有打开的窗口。
  • 检查 JUnique.sendMessage 是否返回 null。
  • 删除 new File(System.getProperty("user.home"), ".junique"); 的内容(LOCK_FILES_DIR,参见 JUnique.java ),或类似的东西原油。
  • 启动应用程序。

关于java - 如果应用程序崩溃,JUnique 锁定的应用程序不会运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25564651/

相关文章:

java - 无法以编程方式添加到 JPanel

java - 如何在 GUI 线程之间共享信息?

java - 获取 StackOverFlow 错误

java - Node.js 与 Java - 计算密集型计算

java - 将静态 java 对象用于软件组件

iphone - 使用调度队列进行 Google 地理编码的效率 - 如何改进 - iPhone

java - Spark 数据帧否定过滤条件

java - 给定一个对象,在 hibernate 中查询该对象所在列表的所有者的最有效方法是什么

python - 我应该使用线程或多处理来对 Python 进行暴力破解吗?

Java Swing并发显示JTextArea