Java:实现检查程序重复运行

一、纯Java实现

  • 原理是一个文件只能同时被一个进程获取锁。
    public class Test{
    
    	// 在应用程序的main方法里调用此函数保证程序只有一个实例在运行.
    	public static boolean makeSingle(String filePath) {
    		RandomAccessFile raf = null;
    		FileChannel channel = null;
    		FileLock lock = null;
    		try {
    			// 在临时文件夹创建一个临时文件,锁住这个文件用来保证应用程序只有一个实例被创建.
    			File sf = new File(filePath);
    			sf.deleteOnExit();
    			sf.createNewFile();
    			raf = new RandomAccessFile(sf, "rw");
    			channel = raf.getChannel();
    			lock = channel.tryLock();
    			System.out.println("lock = "+lock);
    			if (lock == null) {
    				return false;
    				// 如果没有得到锁,则程序退出.
    				// 没有必要手动释放锁和关闭流,当程序退出时,他们会被关闭的.
    //	            throw new Error("An instance of the application is running.");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return true;
    	}
    
    	public static void main(String[] args) throws Exception  {
    		if(makeSingle("singleApp.single") == false) {
    			JOptionPane.showMessageDialog(null,"程序已经运行了!","错误 ",0);
    		}
    	}
    }
    

二、通过调用C++封装的DLL去实现

  • 以C++调用Win32 API遍历进程去检查重复进程或重复窗口名,最后封装成DLL由Java调用。
  • Java调用DLL的方式有:JNI、JNA等

参考资料

发布了56 篇原创文章 · 获赞 5 · 访问量 7442

猜你喜欢

转载自blog.csdn.net/forchoosen/article/details/103534939