Singleton模式public class Test { private Test test = new Test(); public Test getInstance(){
return test;
} // 私有化构造方法,使其无法在本类以外生成新的实例
private Test(){
//...
}
//...}
return test;
} // 私有化构造方法,使其无法在本类以外生成新的实例
private Test(){
//...
}
//...}
private static Test test = new Test();
public class Test { private static Test test = new Test(); public static Test getInstance(){
return test;
} // 私有化构造方法,使其无法在本类以外生成新的实例
private Test(){
//...
}
//...}
private Sing(){
}
private static Sing sing = null; public static Sing newInstance(){
if(sing==null){
sing = new Sing();
}else{
return sing;
}
return sing;
}
}
告诉楼主一个土办法,但很管用。
程序运行时,开一个socket占用一个端口(当然取个古怪点的数字)。
启动时判断是否这个端口被占用。如果占用了,就时已经有实例运行了。
就是在bat要控制的代码前加一段代码将某个0字节文件如a.flag拷贝一个备份为arun.flag。
每次运行时判断是否存在arun.flag文件。
运行结束删除arun.flag。
java没有可在进程间共享的互斥量,看来只有用上面说的文件锁或者socket端口了。
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;class LockFile {
private static String file = "files.lock";
private static FileChannel ch;
private static FileLock lock; public static boolean lock() {
try {
ch = new FileOutputStream("files.lock").getChannel();
lock = ch.tryLock();
if (lock == null)
return false;
else
return true;
}
catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
return false;
}
catch (IOException ex) {
System.out.println(ex.getMessage());
return false;
}
} public static void unLock() {
try {
lock.release();
}
catch (IOException ex2) {
}
try {
ch.close();
}
catch (IOException ex3) {
}
}
}public class SingleRun {
public static void main(String[] args) {
if (!LockFile.lock()) {
System.out.println("One of my Thread has run!");
System.exit(1);
}
try {
Thread.sleep(10000);
}
catch (InterruptedException ex) {
}
LockFile.unLock();
}
}
然后方法实现同步
注意不可dcl