使用文件锁防止多个应用。。
原先发的是通过占用固定端口来判断程序是否重复打开,显然很容易和其他应用程序的端口冲突,
在研究Java能不能访问系统内核对象之前。。先用比较简单的方法:对一个文件加锁来防止多个应用重复打开。
这个方法的缺陷是需要另一个文件参与。
-
package org.yoyo.test;
-
-
import java.awt.Toolkit;
-
import java.awt.event.WindowAdapter;
-
import java.awt.event.WindowEvent;
-
-
import javax.swing.JFrame;
-
import javax.swing.JLabel;
-
import javax.swing.JOptionPane;
-
-
import org.yoyo.lock.IOLock;
-
-
public class TestIOLock {
-
-
/**
-
* @param args
-
*/
-
if (IOLock.lock()) {
-
private static final long serialVersionUID = 1L;
-
-
{
-
this.setSize(200, 200);
-
.getScreenSize().getWidth() - this.getWidth()) / 2,
-
.getHeight() - this.getHeight()) / 2);
-
this.setTitle("程序");
-
-
-
@Override
-
IOLock.unlock();
-
}
-
-
});
-
-
this.setVisible(true);
-
}
-
};
-
} else {
-
}
-
}
-
}
下面是一开始写的。。直接读取项目目录下的lock文件(请自己新建),打成jar包后就不能读到了 囧。
-
package org.yoyo.lock;
-
-
import java.io.FileNotFoundException;
-
import java.io.IOException;
-
import java.io.RandomAccessFile;
-
import java.nio.channels.FileLock;
-
-
public class IOLock {
-
-
-
.getResource(FILE_NAME).getPath();
-
-
-
private static FileLock lock = null;
-
-
static {
-
try {
-
e.printStackTrace();
-
}
-
}
-
-
public synchronized static boolean lock() {
-
try {
-
if (null != lock) {
-
lock.release();
-
}
-
lock = file.getChannel().tryLock();
-
-
return lock != null;
-
e.printStackTrace();
-
return false;
-
}
-
}
-
-
public synchronized static void unlock() {
-
try {
-
if (null != lock) {
-
lock.release();
-
}
-
e.printStackTrace();
-
}
-
}
-
-
}
如果要打jar包得放到项目外面去,因此接下来的改正是改成偷偷往用户的主目录下放一个文件。。
只需要将上面的两个常量修改一下,FILE_NAME改成比较不会重复的名字,FILE_PATH则引自user.home:
这样每次启动时就会在user.home目录下创建FILE_NAME的文件(如果不存在这个文件的话)。
根据这个文件判断是否开启了多个进程。