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 }