如楼上所说,
可以生成一个.pid文件,记录相关信息

解决方案 »

  1.   

    各位楼上的高手,有没有代码可以贴出来一段?
    启动是写文件这个部分是不是要做io操作
    我的io学的不是很好
    如果想跳过这步有什么方法不??
      

  2.   

    启动程序时利用API取得窗口的标题,如果已经存在相同的标题,就不再启动了。
      

  3.   

    只生成一个实例的方法具体做法参照以下代码。
    public class OnlyOne {

    private static OnlyOne _instance;
    private OnlyOne() {
    System.out.println("ok");
    }

    public static final OnlyOne getInstance() {
            if (_instance==null) {
             _instance = new OnlyOne();
            
            }
            else {
             System.out.println("run already");
            }
            return  _instance;      
        }

    }
      

  4.   

    总结一下,关于让Java程序只运行一个实例的问题,其实质是JVM之间通信的问题。楼上的单例模式显然是没有作用的。应该使用文件锁来锁定一个代表程序运行实例的文件,当程序启动时,首先锁定该文件,后继启动的实例一旦发现该文件已被锁定则提示出错信息。(为什么不直接使用文件而是使用文件锁来判断呢?即:在程序启动的时候生成一个文件而在程序退出时删除这个文件,只要判断该文件的存在与否就可以判断实例的运行情况。这是因为我们不能确保删除文件的操作一定能被执行到,程序是可能被强制关闭或异常退出的,而文件锁不同,它是作为系统资源分配给JVM的,一旦JVM当掉,其资源会一并被操作系统回收,因此对文件的锁定也会被消除。)import java.nio.channels.*;
    import java.io.*;
    import javax.swing.JOptionPane;//应用实例控制类
    public class InstanceControl
    {
      FileLock lock=null;
      //判断该应用是否已启动
      public boolean isRunning()
      {
        try
        {
          //获得实例标志文件
          File flagFile=new File("instance");
          //如果不存在就新建一个
          if(!flagFile.exists())flagFile.createNewFile();
          //获得文件锁
          lock=new FileOutputStream("instance").getChannel().tryLock();
          //返回空表示文件已被运行的实例锁定
          if(lock==null)return false;
        }catch(Exception ex){ex.printStackTrace();}
        return true;
      }  public static void main(String[] args)
      {
        InstanceControl ic=new InstanceControl();
        if(ic.isRunning())
          JOptionPane.showMessageDialog(null,"已存在该程序的实例!","提示",JOptionPane.OK_OPTION);
        else
          MainClass.main(args);            
      }
    }
      

  5.   

    用文件锁或者端口控制:
    在你需要控制的程序中加入new InstanceControl().start();就可以了。
    public class InstanceControl
        extends Thread {
      public void run() {
        try {
          Socket sock = new Socket("127.0.0.1", 22222); //创建socket,连接22222端口
          System.exit(0); //连接成功,说明有实例存在,则退出
        }
        catch (Exception e) {}
        try {
          ServerSocket server = new ServerSocket(22222); //创建socket,连接22222端口
          while (true) {
            server.accept(); //接受连接请求
          }
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
      

  6.   

    是不是用不着那么复杂啊?在myhotsun(科科) 写的代码中添加private static OnlyOne _instance;
    private static Object Lock=new Object();//add new
    private OnlyOne(){}//add new
    …………
    if (_instance==null) {
             synthorized(Lock){     //add new
             _instance = new OnlyOne();
            
            }
             }
    是不是就可以了阿?用类本身来保证实例的唯一性,用private定义它的构造方法
      

  7.   

    再次强调:单例模式没用。这是两个不同jvm下的程序。
      

  8.   

    if(ic.isRunning())
    为什么用在我的程序中要
    if (!ic.isRunning()) 
      

  9.   

    if (!ic.isRunning()) 
    那就是上面的程序判断时搞反了,你自己看一下吧。我认为用端口实在是杀鸡用牛刀了呀:)