JAVA程序啓動單一實例妙招

今兒,想起來昨兒,解決的一問題,貼出來你們學習下,因爲工做須要,學習,哈哈~! java

手頭的一個任務,是個java的SWT作的桌面應用程序,有一需求是,程序只能啓動一個實例,二次啓動會提示啓動失敗!網上轉了一大圈幾天也沒找到比較理想的解決方法,在CSND等專業程序員網站上查找過,也沒有找到!我正要放棄的時候,哈哈,被我找到了! 程序員

找了一寫方案,總結起來就是,系統單一實例,就是查看共用資源,若是被佔用,說明已經啓動!有人說用單例模式,那是沒有做用的! windows

網上找到的幾種解決方案: 學習

方案1:程序啓動建立一臨時文件,程序關閉刪除文件,當第二次被啓動的時候發現文件存在,說明程序正在運行,文件不存在說明程序沒有啓動! 網站

問題:當程序非法關閉,沒有執行到刪除文件代碼,文件就會一直存在,程序就永遠啓動不起來,只能手動刪除,方法很好,但考慮問題不周全,容易出問題 操作系統

推薦等級:★☆☆ xml

方案2:程序啓動監聽端口,由於端口在一臺計算機上一個端口號,只能同時被一個應用程序使用,利用了這個方法,當第二次啓動程序時,發現端口被佔用,說明程序正在運行! 資源

問題:方法當然好,不過容易出現端口搶佔的問題,與其餘應用程序共用一個端口號,這樣會影響其餘的應用程序運行,解決方法也是有的,能夠在配置文件裏設置端口號,出現問題我就換,我換我換我換換換,因此使用此方案要選好端口哦!並且程序佔用端口,而不使用端口,這也算是一種資源浪費,殺雞何用宰牛刀! get

推薦等級:★★☆ io

方案3:此方案就是我選擇的終極方案拉,哈哈~!相似方案1,還解決了方案1遺留下來的問題,啓動程序鎖定指定文件,而不是建立和刪除,當程序二次啓動時要鎖定文件時,沒法訪問該文件,說名程序正在運行!(爲何不直接使用文件而是使用文件鎖來判斷呢?即:在程序啓動的時候生成一個文件而在程序退出時刪除這個文件,只要判斷該文件的存在與否就能夠判斷實例的運行狀況。這是由於咱們不能確保刪除文件的操做必定能被執行到,程序是可能被強制關閉或異常退出的,而文件鎖不一樣,它是做爲系統資源分配給JVM的,一旦JVM當掉,其資源會一併被操做系統回收,所以對文件的鎖定也會被消除。)這樣不會干擾下次應用,還限制了只有一個實例!不得不說此方法妙啊!

問題:當鎖定文件被刪除時,找不到鎖定文件,程序會拋出異常,解決方法能夠在查找鎖定文件時發現文件不存在,能夠自動建立文件(另外,要注意,鎖定文件千萬不要鎖定相應的資源文件,如程序相關的配置文件xml和一些properties,可能會發生意外事故,會把鎖定的文件置空,裏面的內容就飛拉,我是身有體會啊,個人log4j的配置文件啊!嗚嗚~~)

推薦等級:★★★★★

方案一、方案2方法可用單很差用,因此不提供相關代碼,下面是方案3的demo代碼,僅供參考!

    public static boolean isLocking(){

       try {

           File flagFile = new File("config/lockInstance");

           if (!flagFile.exists())

              flagFile.createNewFile();

           lock = new FileOutputStream("config/lockInstance").getChannel()

                  .tryLock();

           if (lock == null)

              return true;

       } catch (Exception ex) {

           logger.warn("程序正在運行中……");

       }

       return false;   

    }

***********************************************************************************************

[10月30日補充]

通過幾天應用發現,第三種解決方案仍是有問題會出現,若是應用被複制兩份,那樣程序就不能在次避免啓動多例,考慮了下,若是想要避免這種狀況,能夠在指定位置建立鎖定文件如:c:\windows\system32固然,這樣作不是很道德,哈哈!

相關文章
相關標籤/搜索