我用swing开发了一个桌面应该用程序。
打包成jar文件。双击运行。
双击几次就可以出现多少个界面。
可是我想不管双击多少次,如果已经有一个进程在运行了,就不再启动新的进程了。
脑子里没货不知该怎么搞求教~我做过的:查API Runtime类 Process类及相关类 System类 都查了,没有查到好办法我想,如果能查询当前操作系统已开启的进程,从这里面发现是否开启了我这个程序的进程,如果开启则不做什么,如果没开启则启动一个新进程百度了,没百度出来,怎么查询当前操作系统已开启的进程。。是不是要用本地方法啊?本地方法这个东西,我从来没用过求教

解决方案 »

  1.   

        你现在的思路是不通的,因为所有的纯java应用他的进程名都是一样的,因为它们都运行在JVM进程中,PID也是随机的,所以你是没办法区分到底是哪个JAVA应用。
        要换个思路想,其实可以用很简单的方法实现。当启动应用时,在指定目录里生成一个空的file, 并且锁住这个file。再在程序中添加一个Check方法,当启动应用时Check这个file是否可写,如不可写说明当前已有这个应用启动,那么就不再运行。如果这个file不存在或可写时,说明这个应用当前没有运行,那么继续运行下去并锁住这个file。
        还有很多方法,比如open一个socket也可以,想法和思路同上。
        写程序的时候不要总是期盼着,你的需求都有一个现成的实现,可以自己实现嘛,JDK中没有就写不下去了吗,JDK中的API是给你组合使用的,写程序嘛要任意所至,挥洒自如。目的是要完成你的需求,到底有没有现成的实现这不重要。重要的是思路和想法,不是什么API,什么语言。没有什么唯一的标准答案,否则每个人写出来的程序都是一样的。
        
     
      

  2.   


    觉得锁文件的方法更好一些,因为使用Socket偶尔程序退出了,但是绑定的端口有可能没有释放,但是还是可行的。
      

  3.   

    和Socket通讯,添加校验就可以知道死活了。
      

  4.   


    import java.io.File;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;public class SingleApplication {
        // 在应用程序的main方法里调用此函数保证程序只有一个实例在运行.
        public static void makeSingle() {
            RandomAccessFile raf = null;
            FileChannel channel = null;
            FileLock lock = null;        try {
                // 在临时文件夹创建一个临时文件,锁住这个文件用来保证应用程序只有一个实例被创建.
                File sf = new File(System.getProperty("java.io.tmpdir") + "xxx.single");
                sf.deleteOnExit();
                sf.createNewFile();            raf = new RandomAccessFile(sf, "rw");
                channel = raf.getChannel();
                lock = channel.tryLock();            if (lock == null) {
                    // 如果没有得到锁,则程序退出.
                    // 没有必要手动释放锁和关闭流,当程序退出时,他们会被关闭的.
                    throw new Error("An instance of the application is running.");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }    public static void main(String[] args) throws Exception {
            SingleApplication.makeSingle(); // 保证程序只有一个实例在运行.        // 测试: 模拟一个程序正在运行5秒
            System.out.println("Start");
            System.out.println("Waiting 5 seconds.");        for (int i = 0; i < 5; ++i) {
                Thread.sleep(1000);
                System.out.println((i + 1) + "......");
            }        System.out.println("End");
        }
    }
      

  5.   


    // 这里换成singleId从参数传进来的,这样更好一些。
    // 更好的是从系统的信息中取得当前应用程序的一些唯一信息,如PID,然后用来生成上锁的文件.
    File sf = new File(System.getProperty("java.io.tmpdir") + singleId + ".single");
      

  6.   

    class JavaHowTo {
      public native long getCurrentProcessId();
      static {
        System.loadLibrary("jni2");
      }
    }public class JNIJavaHowTo {
      public static void main(String[] args) {
        JavaHowTo jht = new JavaHowTo();
        System.out.println("Press Any key...");
        java.io.BufferedReader input =
          new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
          try { input.readLine();}
        catch (Exception e) { e.printStackTrace();}
        System.out.println(jht.getCurrentProcessId());
        }
    }// jni2.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include 
    #include "JavaHowTo.h" BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
                         )
    {
        return TRUE;
    }
    JNIEXPORT jlong JNICALL Java_JavaHowTo_getCurrentProcessId
      (JNIEnv *, jobject) {     // return GetCurrentProcessId();
        return getpid();
    }
    这是java中获取pid的方式大体能看懂,但是让我自己写,写不出来,本地方法的使用,还是可以看懂的BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
                         )
    {
        return TRUE;
    }但是这句真看不懂