如何保证仅一个java应用程序实例? 现在写一个小软件,需要保证只有一个应用程序实例在运行,如何做到这一点呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用单例模式public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); //这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton getInstance() { return instance; } } public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); //这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton getInstance() { return instance; } } 他说的是 App 层次的,向你们这么写了,一样能跑两个 App 的。建议楼主写一个 配置文件, 每次启动的时候 读取文件的内容,比如AppIns = 0;如果读取了为零,启动程序,并修改为 AppIns = 1;如果读取了为一,那么退出程序。当然,启动程序后,在程序退出的时候也要再把 AppIns 改回来static void main(String[] args){ File f = new File(); // 读取 *.ini if( AppIns == 1 ) 退出程序 else{ 运行程序 完事了。 修改 AppIns = 0 }} http://topic.csdn.net/u/20100104/10/86d608a3-518e-4e4c-a345-897b1e02f2bd.html 简单的,外部配置文件锁(如果第一次运行就创建一个文件,普遍都放在"user.home"下),程序启动时判断该文件是否被锁住,原来老版本的netbeans就是这么做的,现在都做成exe了。还有一个简单的方法,为程序分配一个没什么作用的端口——如52139等比较偏的端口,每次启动判断端口是否被占用。 用单例模式,私有构造方法。多线程下用double check就可以了。 人家问的是一个应用程序 不是一个instance。。这样哇 他们说的这个singleton是不能做到只有一个程序运行的。你需要这样做,1. 在每次运行程序的时候 去检查windows 或者 其他OS里面的task manager2. 如果task manager里面没有类似的 才启动 否则就自己退出。这个一般的像QQ游戏大厅 都是这样做的 楼主的问题我知道,不过不知道java里面有没有这概念了,呵呵C++里面倒是有,自己添加mutex互斥对象,游戏防止多开就是这么搞的 就算app层 一样可以用单例啊.. 我觉得用端口比较好吧,判断端口是否占用,就像tomcat一样 楼主的问题不是程序里的单实例吧?应该是系统进程里的单实例?那么多单例模式的。5楼说的很好,derby数据库也是这么做的,运行的话建立一个db.lck文件。需要注意的是:1。这种模式只是一般是在当前工作目录下创建文件,而我们都知道java app是绿色的,到处copy都可以运行,所以应该建立全局系统的文件来判断是否已经运行是一个办法,比如放到System.getenv().get("APPDATA")目录。2。如果客户端非正常关闭,使用进程kill掉jvm,那么那个文件修改的动作将没法执行。这样的情况下需要须手动去删除那个上锁的文件了。 5楼的方法并不好 更好的方法是用ServerSocket确保唯一性对IO的访问本身就是一个危险的操作 当我还不知道模式这个东西的时候,我想到了JNI:运行程序前查看进程列表,看有没有相同名字的进程运行。 写文件和端口都不是好的方案。写文件,如果突然断电,文件没有删除,下次启动文件还在,自己就起不来了。端口,你怎么知道其它程序没有占用这个端口,如果我的一个程序正好也和你一样的想法找一个不用的端口,又正好和你相同怎么办?JVM启动后设置一个System.setProperty("一个随机串","true");每次检查是否设置了这个属性,如果有说明别人启动了,直接System.exit();如果没有就自己设置这个属性,正常运行。 这个办法也不是万无一失,它们为啥要用一个JVM?环境里不能有几个JVM? 对每一个java程序进程来说,System.setProperty设置的环境变量时局部的,不会影响全局的。 截屏软件截屏时怎样实现截屏区域有方框显示 关于运行.jar文件的问题 关于java连接sql的问题 求助JAVA连ORACLE问题 我用java写的遗传算法的严重问题,程序没错,但不知道为什么结果总和预想的不同,实在是困惑,请帮忙啊!!!! 讨论一下,java内部类的区别:静态成员类,成员类,局部类,和匿名类,他们分别最适合在是什么场合使用 插入排序问题. 关于文件操作(初级问题),谢谢 欢迎个路英雄豪杰来参加讨论 寻求有关通讯的源代码,可以发到我油箱[email protected],小女子先谢谢了!100分 求一个md5加密算法的例子 求个方法,排列String类型的数字
public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); //这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
public static Singleton getInstance() {
return instance;
}
}
如果读取了为一,那么退出程序。当然,启动程序后,在程序退出的时候也要再把 AppIns 改回来static void main(String[] args){ File f = new File(); // 读取 *.ini
if( AppIns == 1 )
退出程序
else{
运行程序
完事了。
修改 AppIns = 0
}
}
还有一个简单的方法,为程序分配一个没什么作用的端口——如52139等比较偏的端口,每次启动判断端口是否被占用。
多线程下用double check就可以了。
人家问的是一个应用程序 不是一个instance。。这样哇 他们说的这个singleton是不能做到只有一个程序运行的。你需要这样做,1. 在每次运行程序的时候 去检查windows 或者 其他OS里面的task manager
2. 如果task manager里面没有类似的 才启动 否则就自己退出。这个一般的像QQ游戏大厅 都是这样做的
C++里面倒是有,自己添加mutex互斥对象,游戏防止多开就是这么搞的
1。这种模式只是一般是在当前工作目录下创建文件,而我们都知道java app是绿色的,到处copy都可以运行,所以应该建立全局系统的文件来判断是否已经运行是一个办法,比如放到System.getenv().get("APPDATA")目录。2。如果客户端非正常关闭,使用进程kill掉jvm,那么那个文件修改的动作将没法执行。这样的情况下需要须手动去删除那个上锁的文件了。
5楼的方法并不好 更好的方法是用ServerSocket确保唯一性对IO的访问本身就是一个危险的操作
写文件,如果突然断电,文件没有删除,下次启动文件还在,自己就起不来了。
端口,你怎么知道其它程序没有占用这个端口,如果我的一个程序正好也和你一样的想法找一个不用的端口,又正好和你相同怎么办?JVM启动后设置一个System.setProperty("一个随机串","true");
每次检查是否设置了这个属性,如果有说明别人启动了,直接System.exit();
如果没有就自己设置这个属性,正常运行。
这个办法也不是万无一失,它们为啥要用一个JVM?环境里不能有几个JVM?