如何让程序(如java Hello)只启动一次?
如何让程序(如java Hello)只启动一次?
摘自http://bbs.csdn.net/topics/50488704
总结一下,关于让Java程序只运行一个实例的问题,其实质是JVM之间通信的问题。楼上的单例模式显然是没有作用的。
应该使用文件锁来锁定一个代表程序运行实例的文件,当程序启动时,首先锁定该文件,后继启动的实例一旦发现该文件已被锁定则提示出错信息。(为什么不直接使用文件而是使用文件锁来判断呢?即:在程序启动的时候生成一个文件而在程序退出时删除这个文件,只要判断该文件的存在与否就可以判断实例的运行情况。这是因为我们不能确保删除文件的操作一定能被执行到,程序是可能被强制关闭或异常退出的,而文件锁不同,它是作为系统资源分配给JVM的,一旦JVM当掉,其资源会一并被操作系统回收,因此对文件的锁定也会被消除。)
1 package packa; 2 3 import java.nio.channels.*; 4 import java.io.*; 5 6 //应用实例控制类 7 public class InstanceControl 8 { 9 private static FileLock lock = null; 10 11 //判断该应用是否已启动 12 public static boolean isRunning() 13 { 14 try 15 { 16 //获得实例标志文件 17 File flagFile = new File(".lock"); 18 19 //如果不存在就新建一个 20 if(!flagFile.exists()) 21 flagFile.createNewFile(); 22 23 //获得文件锁 24 lock = new FileOutputStream(flagFile).getChannel().tryLock(); 25 26 //返回空表示文件已被运行的实例锁定 27 if(lock==null) 28 return false; 29 } 30 catch(Exception ex) 31 { 32 ex.printStackTrace(); 33 } 34 return true; 35 } 36 37 public static void main(String[] args) 38 { 39 if (isRunning()) 40 { 41 System.out.println("xxxxxxxxxxxxxxxxxx"); 42 try 43 { 44 Thread.sleep(100000); 45 } 46 catch (Exception e) 47 { 48 e.printStackTrace(); 49 } 50 } 51 else 52 System.out.println("xxxxxxxx.....xxxxxxxxxx"); 53 } 54 }