如何让程序(如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 try15 {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 try43 {44 Thread.sleep(100000);45 }46 catch (Exception e)47 {48 e.printStackTrace();49 }50 }51 else52 System.out.println("xxxxxxxx.....xxxxxxxxxx"); 53 }54 }