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);
|
}
|
}
|