| | |
| | | private static FileChannel channel; |
| | | |
| | | /** |
| | | * 尝试获取应用程序锁 |
| | | * @return true-成功获取锁(第一次运行), false-获取失败(已有实例运行) |
| | | * 尝试获取应用程序锁 |
| | | * @return true-成功获取锁(第一次运行), false-获取失败(已有实例运行) |
| | | */ |
| | | @SuppressWarnings("resource") |
| | | public static boolean lock() { |
| | | try { |
| | | // 创建文件对象 |
| | | // 创建文件对象 |
| | | File file = new File(LOCK_FILE); |
| | | |
| | | // 如果文件存在但无法删除,可能是其他实例正在运行 |
| | | // 如果文件存在但无法删除,可能是其他实例正在运行 |
| | | if (file.exists() && !file.delete()) { |
| | | return false; |
| | | } |
| | | |
| | | // 创建文件并获取通道 |
| | | // 创建文件并获取通道 |
| | | RandomAccessFile raf = new RandomAccessFile(file, "rw"); |
| | | channel = raf.getChannel(); |
| | | |
| | | // 尝试获取独占锁 |
| | | // 尝试获取独占锁 |
| | | lock = channel.tryLock(); |
| | | |
| | | // 如果获取到锁,返回true |
| | | // 如果获取到锁,返回true |
| | | return lock != null; |
| | | } catch (IOException e) { |
| | | // 发生异常说明可能已有实例运行 |
| | | // 发生异常说明可能已有实例运行 |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 释放应用程序锁 |
| | | * 释放应用程序锁 |
| | | */ |
| | | public static void release() { |
| | | try { |
| | | // 释放锁 |
| | | // 释放锁 |
| | | if (lock != null && lock.isValid()) { |
| | | lock.release(); |
| | | } |
| | | // 关闭通道 |
| | | // 关闭通道 |
| | | if (channel != null && channel.isOpen()) { |
| | | channel.close(); |
| | | } |
| | | // 删除锁文件 |
| | | // 删除锁文件 |
| | | File file = new File(LOCK_FILE); |
| | | if (file.exists()) { |
| | | file.delete(); |
| | | } |
| | | } catch (IOException e) { |
| | | // 释放锁时忽略异常 |
| | | // 释放锁时忽略异常 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 检查程序是否已在运行并显示警告 |
| | | * 检查程序是否已在运行并显示警告 |
| | | */ |
| | | public static void showAlreadyRunningWarning() { |
| | | JOptionPane.showMessageDialog(null, |
| | | "程序已经打开,请勿重复打开", |
| | | "警告", |
| | | "程序已经打开,请勿重复打开", |
| | | "警告", |
| | | JOptionPane.WARNING_MESSAGE); |
| | | } |
| | | } |