【发布时间】:2014-08-29 08:40:01
【问题描述】:
我正在开发一个 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 锁?
【问题讨论】:
-
定义“崩溃”。该文档指出,锁“将在 JVM 停止时自动释放”。此外,打印并发布该
AlreadyLockedException的堆栈跟踪。 -
@chrylis,没错,它释放了锁,但是如果其他程序也在运行 JVM,那么 JVM 不会停止。即使我的应用程序崩溃,JVM 中的锁仍然存在。
-
“其他程序”是什么意思?听起来你不明白 Java 程序的启动是如何工作的。
-
@chrylis,我知道 java 程序是如何工作的。当我运行我的应用程序并且如果它崩溃时,它会停止 JVM,并且再次运行新实例没有问题。但是,如果我的应用程序在我使用 ecilpse 时崩溃,它会以某种方式在 JVM 中保持活动状态,因为 Eclipse 仍在使用 JVM。在我关闭 Eclipse 之前,应用程序无法再次启动。
标签: java multithreading swing uncaughtexceptionhandler