2012-01-21 64 views
2

因此,我將項目打包爲可執行的單個可執行jar。但有時用戶多次啓動文件,這會導致它啓動同一項目的多個實例(導致意外的行爲,例如通過延遲的項目實例覆蓋文件中的值)。僅運行可執行Jar文件的單個實例

我想知道的Windows平臺(Win7),有什麼選擇鎖定執行只有一次,然後如果jar已經運行,只是不要繼續執行代碼。

我讀過Process ID的內容,但是如果有多個java應用程序,它們最終都會顯示imagename爲javaw.exe,我該如何確定自己的進程ID?

請建議什麼是做這件事的正確方法,謝謝!

回答

3

最簡單的解決方案是使用固定的未使用端口。

ServerSocket ss; 
try { 
    ss = new ServerSocket(MY_PORT); 
    // not already running. 
} catch (BindException e) { 
    // already running. 
} 
+0

非常感謝你,這是迄今爲止任何平臺的最佳解決方案:) – Johnydep

1

根據我的經驗,我使用的最佳方法是在特定端口(如61234)上創建監聽ServerSocket。套接字沒有做任何事情,但如果你設法創建它,這意味着沒有其他進程已經啓動。可執行jar文件的重複實例將無法在同一端口上創建ServerSocket,因此它們應該退出。

1

您可以在應用程序啓動時在專用TCP端口上打開ServerSocket,並在應用程序關閉時關閉它。

如果一個實例已經在運行,你會得到一個「端口在使用」異常。