2015-06-28 62 views
0

我需要編寫一個程序,它可以在單個實例中執行。我試圖創建一個臨時文件並在退出程序之前將其刪除。如果程序與緊急(例如電力的削減)完成發生單個程序實例

public static boolean isLocked() { 
    File f = new File("lock.txt"); 
    return f.exists(); 
} 

public static void lock() { 
    String fname = "lock.txt"; 
    File f = new File(fname); 
    try { 
     f.createNewFile(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public static void unlock() { 
    File f = new File("lock.txt"); 
    f.delete(); 
} 

在幀

private void initialize() { 
    lock(); 
    } 

    private void setFrameHandler() { 
    frame.addWindowListener(new java.awt.event.WindowAdapter() { 
     @Override 
     public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
      unlock(); 
     } 
    }); 
} 

問題。文件不會被刪除,並且不可能運行新的實例。 如何進行可靠的單實例驗證?

+2

你說的話「單指做例如「? – RealSkeptic

+0

我的意思是隻有一個JAVA程序的實例可以在特定的時間執行。如果用戶在程序運行時啓動jar文件,他會收到錯誤消息。 – mambetizm

+1

可能的重複:http://stackoverflow.com/questions/7036108/prevent-launching-multiple-instances-of-a-java-application。還相關:http://www.rgagnon.com/javadetails/java-0288.html簡單的解決方案:嘗試創建ServerSocket。 – Pshemo

回答

1

描述here 使用GetProcesses方法可以在啓動檢查程序的另一個實例但是,這隻能根據情況你有(可能無法看到其他用戶的所有進程)

另一件事你可以做的是簡單地檢查,如果一個特定的文件通過File.Open

鎖定
File.Open ("path.lock", FileMode.OpenOrCreate, FileAccess.ReadWrite); 

只要你保持造成的FileStream在你的程序中沒有任何其他程序可以打開該模式的文件或者打開。這基本上是Unix鎖文件的工作原理。當然,你必須捕獲一個IOException(暗示你到一個鎖定的文件)。

聲明:我沒有試過這個代碼,所以請檢查我是否給你正確的參數。

編輯:你也可以看看這個代碼項目article如何使用Win32 API

使用Windows消息的另一種嘗試已經完成here

0

在單臺機器上的一個簡單方法是編寫一個'PID文件',它實際上是一個包含當前正在運行的進程的操作系統ID的文件。您在開始「關鍵」工作時創建該工作,並在成功完成時將其刪除。

由於使用相同的PID不可能再次啓動該進程,因此您可以簡單地檢查PID文件是否已經存在,如果是,如果該進程仍在運行。