62,634
社区成员




package com.lh.common.api.oneinstance;
/**
*
* 唯一进程
*/
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
/**
* 唯一进程,不建议外部使用
* @project_name 华程网管平台
* @ClassName OneInstance
* @author 唐显恒
* @date 2012-12-5 下午02:06:44
* @version 1.0
*/
public class OneInstance {
private FileChannel channel;
private FileLock lock;
private File file;
private static OneInstance instance = null;
/**
* 获取唯一进程限制的实例
* @Title: getInstance
* @return 唯一进程实例
*/
public static OneInstance getInstance(){
if(instance == null){
instance = new OneInstance();
}
return instance;
}
/**
* 进程是否正在运行
* @Title: isAppActive
* @return 运行与否
*/
public boolean isAppActive() {
File file = new File(".lock");
try {
channel = new RandomAccessFile(file, "rw").getChannel();
try {
lock = channel.tryLock();
} catch (OverlappingFileLockException e) {
closeLock();
return true;
}
if (lock == null) {
closeLock();
return true;
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
closeLock();
deleteFile();
}
});
return false;
} catch (Exception e) {
closeLock();
return true;
}
}
/**
* 进程是否正在运行
* @Title: isAppActive
* @return 运行与否
*/
public boolean isAppActive(String path) {
File file = new File(path);
try {
channel = new RandomAccessFile(file, "rw").getChannel();
try {
lock = channel.tryLock();
} catch (OverlappingFileLockException e) {
closeLock();
return true;
}
if (lock == null) {
closeLock();
return true;
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
closeLock();
deleteFile();
}
});
return false;
} catch (Exception e) {
closeLock();
return true;
}
}
protected void deleteFile() {
try {
file.delete();
} catch (Exception e) {
}
}
private void closeLock() {
try {
lock.release();
} catch (Exception e) {
}
try {
channel.close();
} catch (Exception e) {
}
}
public static void main(String[] args) {
if (OneInstance.getInstance().isAppActive() == true)
JOptionPane.showMessageDialog(null, "已有一个程序在运行,程序退出");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}