package home; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import javax.swing.JOptionPane; public class SingleInstanceLock { private static final String LOCK_FILE = System.getProperty("user.home") + File.separator + ".myapp.lock"; private static FileLock lock; private static FileChannel channel; /** * 尝试获取应用程序锁 * @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 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); } }