java程序 避免重复启动的方法
http://www.cppblog.com/biao/archive/2010/12/23/137254.html
1 package swingtest; 2 3 import java.io.File; 4 5 import java.io.RandomAccessFile; 6 7 import java.nio.channels.FileChannel; 8 9 import java.nio.channels.FileLock; 10 import java.util.concurrent.TimeUnit; 11 12 13 public class SingleApplication { 14 15 // 在应用程序的main方法里调用此函数保证程序只有一个实例在运行. 16 17 public static void makeSingle(String singleId) { 18 19 RandomAccessFile raf = null; 20 21 FileChannel channel = null; 22 23 FileLock lock = null; 24 25 26 try { 27 28 // 在临时文件夹创建一个临时文件,锁住这个文件用来保证应用程序只有一个实例被创建. 29 30 File sf = new File(System.getProperty("java.io.tmpdir") + singleId + ".single"); 31 32 sf.deleteOnExit(); 33 34 sf.createNewFile(); 35 36 37 raf = new RandomAccessFile(sf, "rw"); 38 39 channel = raf.getChannel(); 40 41 lock = channel.tryLock(); 42 43 44 if (lock == null) { 45 46 // 如果没有得到锁,则程序退出. 47 48 // 没有必要手动释放锁和关闭流,当程序退出时,他们会被关闭的. 49 50 throw new Error("An instance of the application is running."); 51 52 } 53 54 } catch (Exception e) { 55 56 e.printStackTrace(); 57 58 } 59 60 } 61 62 63 public static void main(String[] args) throws Exception { 64 65 SingleApplication.makeSingle("single.test"); // 保证程序只有一个实例在运行. 66 67 68 // 测试: 模拟一个程序正在运行5秒 69 70 System.out.println("Start"); 71 72 System.out.println("Waiting 5 seconds."); 73 74 TimeUnit.SECONDS.sleep(25); 75 76 77 System.out.println("End"); 78 79 } 80 81 }