如何让程序?如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 }