熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

讓Java程序只運行一個實例

2013-11-23 17:55:44  來源: Javascript 

  一個程序可以在內存裡面存在多個運行實例比如你可以打開多個微軟的Word程序但是有些時候我們需要控制程序運行的實例只有一個也就是說該程序同一時刻在內存裡面運行的只有一個實例這樣當這個程序在內存中已經存在一個運行實例而用戶又再次運行了該程序的時候有兩種結果第一種結果是結束目前的運行實例打開新運行的實例第二種就是讓新運行的實例退出原有的運行實例繼續運行
  
  原理
  因為任何時候只有一個實例所以在實現這種功能的時候必須借助只能被獨享的資源如果我們的程序是基於某個平台的那麼就可以借助操作系統的內核對象來完成比如Windows操作系統就提供了CreateMutex這個API來創建一個獨享的內核對象但是因為要考慮平台無關Java程序的實例控制不應該使用系統的內核對象來完成那麼我們就必須找到其它的可以獨享的資源實際上一台機器無論是在什麼操作系統上網絡端口都是獨享的也就是說基於網絡端口這個獨享的原理我們可以很方便地讓我們的Java程序實現在內存裡面只有一個運行實例這個功能而且這個功能的實現是與平台無關的
  
  實現
  我們先來看看第一種情況是如何實現的也就是說如果系統中已經存在運行實例的話那麼結束原有的運行實例讓新實例運行這個實現實例控制的Java類也是一個線程具體的實現如下
  
  import *;
  public class InstanceControl extends Thread {
   public void run() {
   try{
    Socket sock = new Socket();
  //創建socket連接端口                   
   }
   catch (Exception e)
   {}
   try{
    ServerSocket server = new ServerSocket();//創建socket端口監聽
    serveraccept(); //等待連接
    serverclose(); //有連接到來也就是說有新的實例
    Systemexit(); //這個實例退出
   }catch (Exception e)
   {
    eprintStackTrace();
   }
   }
  }
  
  下面這個Java程序的程序入口是沒有實例控制功能的
  
  public class ProgramMain {
   public static void main(String argv[])
   {
   mainFrame frame = new mainFrame();
   }
  }
  
  現在想加入實例控制只需要添加兩行代碼添加後代碼如下所示
  
  public class ProgramMain {
   public static void main(String argv[])
   {
   InstanceControl ic = new InstanceControl();
   icstart();
   mainFrame frame = new mainFrame();
   }
  }
  
  在這個基礎上要實現第二種情況也就是已經有實例運行的情況下新的實例退出保持原有的運行實例就只需要一點小的改動了具體的實現如下
  
  import *;
  public class InstanceControl extends Thread {
   public void run() {
   try{
    Socket sock = new Socket( );//創建socket連接端口
    Systemexit(); //連接成功說明有實例存在則退出
   }catch (Exception e)
   {}
   try{
    ServerSocket server = new ServerSocket();//創建socket連接端口
    while (true)
    {
    serveraccept(); //接受連接請求
    }
   }catch (Exception e)
   {
    eprintStackTrace();
   }
   }
  }
  
  這個類的使用方法和第一種情況的那個類是一樣的只需要在原有的代碼上加入兩行代碼即可
  
  InstanceControl ic = new InstanceControl();
  icstart();
  
  擴展
  上面的程序也許有一個小bug就是如果程序在開始運行時ServerSocket監聽的端口已經被其它程序占用那麼程序的運行就會受到影響所以程序的端口應該盡量取得大一些在這種情況下其它程序占用這個程序使用的端口的概率是可以忽略不計的同時還可以做兩種擴展第一種是把端口寫在配置文件中可通過讀配置文件得到端口這樣就能夠在其它程序占用目前端口的情況下改變這個程序使用的端口還有一種是在運行的時候用兩個InstanceControl類分別在兩個端口監聽只要有一個InstanceControl類得到連接就做出響應這樣兩個端口都被其它程序占用的概率就更加的微乎其微了
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25374.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.