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