就是说,如何检测本程序已经运行?

解决方案 »

  1.   


    public class Singleton {
       private Singleton sing = new Singletion();
       private Singleton(){
       }
       public static synchronized  Singleton  getInstance(){
              return  sing;
       }
    }
      

  2.   

    上面改一下。
    private static Singleton sing = new Singletion();
      

  3.   

    lz说的应该是 如何不能启动两个jvm启动同一程序吧,单例是不能解决问题的,在两个进程之间是互不影响的,lz的问题解决了吗?我不是太清楚你的真正用意.
      

  4.   

    一般用户只有一个JVM
    不考虑得太复杂了
    难道楼上的还有高招?
      

  5.   

    一个进程就是一个jvm,如果你要是开发cs程序,就有可能启动了一个程序后不希望再启动同样一个程序了,如果在启动一个就是两个jvm了,在任务管理器里面就是两个java.exe.在java里面两个进程之间是不能通信的,如果你启动了一个后不想启动另一个就的使用GUI句柄,或使用一个临时文件做标识.如果楼主是在一个jvm里面就是说只使用一次java.exe启动后保证一个类只有一个实例的话使用单例就可以了.单例模式比较简单你百度下到处都是.
      

  6.   

    在多个JVM下,只允许运行一个你的程序,那就要借助外部因素来控制了.比如文件/数据库,等.
    在一个JVM下作控制的话,单例模式即可.
      

  7.   

    我用JNI:
    public final class SingleApp {
    static {
    System.loadLibrary("SingleApp");
    } public static native boolean isRunning(String appName);        //测试
    public static void main(String[] args) {
    System.out.println(SingleApp.isRunning("YourApplicationName"));
    try {
    while (true) {
    Thread.sleep(10);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    头文件SingleApp.h:
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class SingleApp */#ifndef _Included_SingleApp
    #define _Included_SingleApp
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     SingleApp
     * Method:    isRunning
     * Signature: (Ljava/lang/String;)Z
     */
    JNIEXPORT jboolean JNICALL Java_SingleApp_isRunning
      (JNIEnv *, jclass, jstring);#ifdef __cplusplus
    }
    #endif
    #endif
    Windows下CPP文件SingleApp.cpp:
    #include <windows.h>
    #include "SingleApp.h"JNIEXPORT jboolean JNICALL Java_SingleApp_isRunning(JNIEnv *env, jclass object, jstring appName)
    {
    char *AppName = (char *)env->GetStringUTFChars(appName, 0);
    HANDLE hMutex = CreateMutex(NULL, FALSE, AppName);
    env->ReleaseStringUTFChars(appName, AppName);
    if(hMutex == NULL || GetLastError() == ERROR_ALREADY_EXISTS)
    return TRUE;
    return FALSE;
    }
    Linux/Unix下,可以用Unix Domain Socket。
      

  8.   

    对啊,单例模式只能保证在运行某个程序的时候,某个对象在内存中只有一个实例;但是无法查出在运行这个app之前内存中是否有重复的实例
      

  9.   


    简单有效的方法
    启动时占用 serverSocket(XXXX);// 一个端口
    如果没有把错,则此为第一个实例
    否则
      

  10.   

    11楼的兄弟帮忙把char *AppName 转换成LPCWSTR 吧,我是vs2005,我查了些api没转明白
    不转不能编译
    a2w转后报错
    MultiByteToWideChar没用明白
      

  11.   

    public class Singleton {
       private Singleton sing = new Singletion();
       private Singleton(){
       }
       public static synchronized  Singleton  getInstance(){
              return  sing;
       }
    }
      

  12.   

    boolean isApplicationRunning(final InetAddress host,
                final int port) {
            try {
                Socket socket = new Socket(host, port);
                try {
                    socket.setKeepAlive(true);
                    String test = "" + System.currentTimeMillis();
                    OutputStream out = socket.getOutputStream();
                    InputStream in = null;
                    try {
                        System.out.println("found running control service on " 
                                + host + ":" + port); 
                        out.write(("PING " + test).getBytes());
                        out.flush();
                        socket.shutdownOutput();
                        in = socket.getInputStream();
                        StringBuffer commandResult = new StringBuffer();
                        byte[] buf = new byte[16];
                        int len;
                        while ((len = in.read(buf)) != -1) {
                            commandResult.append(new String(buf, 0, len));
                        }
                        socket.shutdownInput();
                        if (commandResult.toString().startsWith("OK") 
                                && (commandResult.toString().indexOf(test) != -1)) {
                            System.out.println("PING command succeed"); 
                            return true;
                        }
                        System.out.println("PING command failed"); 
                    } finally {
                        try {
                            out.close();
                        } catch (IOException ioe) {
                            // ignore
                        }
                        if (in != null) {
                            try {
                                in.close();
                            } catch (IOException ioe) {
                                // ignore
                            }
                        }
                    }
                } finally {
                    socket.close();
                }
            } catch (IOException ioe) {
                System.out.println(
                        "seems that there is no control service running on " 
                        + host + ":" + port); 
                //ioe.printStackTrace();
            }
            return false;
        }
      

  13.   

    我觉得可以用tryLock()一个文件啊,用端口的话要是其程序也用那个就没折了
      

  14.   

    单例模式public class Singleton { 
       private static Singleton sing = new Singletion(); 
       private Singleton(){ 
       } 
       public static synchronized  Singleton  getInstance(){ 
              return  sing; 
       } 
    }
      

  15.   

    [email protected]  十分感谢!老兄如果可以的话,给我源码吧,我要这程序本身没什么用,主要是顺便学学c++,如果我实现这东西肯定用锁文件的形式.想补习下c++.
      

  16.   

    没有测试 但是还是感觉用单例模式不正确吧 即使只有一个jvm
      

  17.   

    使用文件控制,可能会导致不能启动的问题。单态这种设计模式根启动没关系。只能保证某个class只产生一个实例。