今天遇到一个问题,记录一下处理过程。
当程序连续启动两次时,会导致某些操作异常,系统无法使用。通过FileLock来避免了此问题,在程序启动时调用,如果可以正常获取则继续启动,否则提示推出程序。
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class StartFileLock {
private static final String FILE_LOCK = "start.lock";
private static final int MAX_TRYLOCK_COUNT = 10;
/**
* 只允许在一台机器启动一次
* @throws Exception
*/
public static void lock() throws Exception {
try {
File lockFile = new File(FILE_LOCK);
lockFile.deleteOnExit();
RandomAccessFile fos = new RandomAccessFile(lockFile, "rws");
FileChannel fcin = fos.getChannel();
FileLock flin = null;
for (int i = 0; i < MAX_TRYLOCK_COUNT; i++) {
try {
flin = fcin.tryLock();
break;
} catch (Exception e) {
Thread.sleep(500);
}
}
if(flin==null||!flin.isValid()){
throw new Exception("已经启动,不能重复启动!");
}
} catch (Throwable e) {
throw new Exception(e.getMessage());
}
}
}