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