现在写一个小软件,需要保证只有一个应用程序实例在运行,如何做到这一点呢?

解决方案 »

  1.   

    用单例模式
    public class Singleton {  private Singleton(){}  private static Singleton instance = new Singleton();  //这里提供了一个供外部访问本class的静态方法,可以直接访问  
      public static Singleton getInstance() {
        return instance;   
       } 
    }
      

  2.   

    public class Singleton {  private Singleton(){}  private static Singleton instance = new Singleton();  //这里提供了一个供外部访问本class的静态方法,可以直接访问  
      public static Singleton getInstance() {
        return instance;   
       } 
    }
      

  3.   

    他说的是 App 层次的,向你们这么写了,一样能跑两个 App 的。建议楼主写一个 配置文件, 每次启动的时候 读取文件的内容,比如AppIns = 0;如果读取了为零,启动程序,并修改为 AppIns = 1;
    如果读取了为一,那么退出程序。当然,启动程序后,在程序退出的时候也要再把 AppIns 改回来static void main(String[] args){   File f = new File();   // 读取 *.ini
       if( AppIns == 1 )
         退出程序
       else{
         运行程序      
         完事了。
          修改 AppIns = 0
       }
    }
      

  4.   

    http://topic.csdn.net/u/20100104/10/86d608a3-518e-4e4c-a345-897b1e02f2bd.html
      

  5.   

    简单的,外部配置文件锁(如果第一次运行就创建一个文件,普遍都放在"user.home"下),程序启动时判断该文件是否被锁住,原来老版本的netbeans就是这么做的,现在都做成exe了。
    还有一个简单的方法,为程序分配一个没什么作用的端口——如52139等比较偏的端口,每次启动判断端口是否被占用。
      

  6.   

    用单例模式,私有构造方法。
    多线程下用double check就可以了。
      

  7.   


    人家问的是一个应用程序  不是一个instance。。这样哇  他们说的这个singleton是不能做到只有一个程序运行的。你需要这样做,1. 在每次运行程序的时候  去检查windows 或者 其他OS里面的task manager
    2. 如果task manager里面没有类似的 才启动  否则就自己退出。这个一般的像QQ游戏大厅 都是这样做的 
      

  8.   

    楼主的问题我知道,不过不知道java里面有没有这概念了,呵呵
    C++里面倒是有,自己添加mutex互斥对象,游戏防止多开就是这么搞的
      

  9.   

    就算app层 一样可以用单例啊..
      

  10.   

    我觉得用端口比较好吧,判断端口是否占用,就像tomcat一样
      

  11.   

    楼主的问题不是程序里的单实例吧?应该是系统进程里的单实例?那么多单例模式的。5楼说的很好,derby数据库也是这么做的,运行的话建立一个db.lck文件。需要注意的是:
    1。这种模式只是一般是在当前工作目录下创建文件,而我们都知道java app是绿色的,到处copy都可以运行,所以应该建立全局系统的文件来判断是否已经运行是一个办法,比如放到System.getenv().get("APPDATA")目录。2。如果客户端非正常关闭,使用进程kill掉jvm,那么那个文件修改的动作将没法执行。这样的情况下需要须手动去删除那个上锁的文件了。
      

  12.   


    5楼的方法并不好  更好的方法是用ServerSocket确保唯一性对IO的访问本身就是一个危险的操作
      

  13.   

    当我还不知道模式这个东西的时候,我想到了JNI:运行程序前查看进程列表,看有没有相同名字的进程运行。
      

  14.   

    写文件和端口都不是好的方案。
    写文件,如果突然断电,文件没有删除,下次启动文件还在,自己就起不来了。
    端口,你怎么知道其它程序没有占用这个端口,如果我的一个程序正好也和你一样的想法找一个不用的端口,又正好和你相同怎么办?JVM启动后设置一个System.setProperty("一个随机串","true");
    每次检查是否设置了这个属性,如果有说明别人启动了,直接System.exit();
    如果没有就自己设置这个属性,正常运行。
      

  15.   


    这个办法也不是万无一失,它们为啥要用一个JVM?环境里不能有几个JVM?
      

  16.   

    对每一个java程序进程来说,System.setProperty设置的环境变量时局部的,不会影响全局的。