国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

讓Java程序只運行一個實例

瀏覽:49日期:2024-07-02 15:43:21
內容: 一個程序可以在內存里面存在多個運行實例,比如,你可以打開多個微軟的Word程序。但是,有些時候我們需要控制程序運行的實例只有一個,也就是說,該程序同一時刻在內存里面運行的只有一個實例。這樣當這個程序在內存中已經存在一個運行實例而用戶又再次運行了該程序的時候,有兩種結果,第一種結果是結束目前的運行實例,打開新運行的實例;第二種就是讓新運行的實例退出,原有的運行實例繼續運行。 原理 因為任何時候只有一個實例,所以在實現這種功能的時候必須借助只能被獨享的資源。如果我們的程序是基于某個平臺的,那么就可以借助操作系統的內核對象來完成,比如Windows操作系統就提供了CreateMutex這個API來創建一個獨享的內核對象。但是因為要考慮平臺無關,Java程序的實例控制不應該使用系統的內核對象來完成,那么我們就必須找到其它的、可以獨享的資源。實際上,一臺機器無論是在什么操作系統上,網絡端口都是獨享的,也就是說基于網絡端口這個獨享的原理,我們可以很方便地讓我們的Java程序實現在內存里面只有一個運行實例這個功能,而且這個功能的實現是與平臺無關的。 實現 我們先來看看第一種情況是如何實現的,也就是說如果系統中已經存在運行實例的話,那么結束原有的運行實例,讓新實例運行。這個實現實例控制的Java類也是一個線程,具體的實現如下: import java.net.*;public class InstanceControl extends Thread { public void run() { try{ Socket sock = new Socket('127.0.0.1',22222); //創建socket,連接22222端口  } catch (Exception e) {} try{ ServerSocket server = new ServerSocket(22222);//創建socket,在22222端口監聽 server.accept(); //等待連接 server.close(); //有連接到來,也就是說有新的實例 System.exit(0); //這個實例退出 }catch (Exception e) { e.printStackTrace(); } }} 下面這個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(); ic.start(); mainFrame frame = new mainFrame(); }} 在這個基礎上,要實現第二種情況,也就是已經有實例運行的情況下,新的實例退出,保持原有的運行實例,就只需要一點小的改動了。具體的實現如下: import java.net.*;public class InstanceControl2 extends Thread { public void run() { try{ Socket sock = new Socket('127.0.0.1', 22222);//創建socket,連接22222端口 System.exit(0); //連接成功,說明有實例存在,則退出 }catch (Exception e) {} try{ ServerSocket server = new ServerSocket(22222);//創建socket,連接22222端口 while (true) { server.accept(); //接受連接請求 } }catch (Exception e) { e.printStackTrace(); } }} 這個類的使用方法和第一種情況的那個類是一樣的,只需要在原有的代碼上加入兩行代碼即可: InstanceControl2 ic = new InstanceControl();ic.start(); 擴展上面的程序也許有一個小bug,就是如果程序在開始運行時ServerSocket監聽的端口已經被其它程序占用,那么程序的運行就會受到影響。所以程序的端口應該盡量取得大一些,在這種情況下其它程序占用這個程序使用的端口的概率是可以忽略不計的。同時,還可以做兩種擴展,第一種是把端口寫在配置文件中,可通過讀配置文件得到端口,這樣就能夠在其它程序占用目前端口的情況下改變這個程序使用的端口。還有一種是在運行的時候用兩個InstanceControl類分別在兩個端口監聽,只要有一個InstanceControl類得到連接就做出響應,這樣兩個端口都被其它程序占用的概率就更加的微乎其微了。 轉自: 賽迪網 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標簽: Java
相關文章:
主站蜘蛛池模板: 国产在线观看午夜不卡 | 日本中文字幕不卡免费视频 | 亚洲另类视频在线观看 | 欧美亚洲国产片在线观看 | 成人在线免费视频 | 国产99视频精品免费观看9e | 看a网站 | 国产精品怡红院在线观看 | 亚洲精品天堂一区在线观看 | 最爽的乱淫片免费 | 国产男女免费完整视频 | 日韩精品视频美在线精品视频 | 国产在线不卡午夜精品2021 | 99亚洲视频 | 萌白酱白丝护士服喷水铁牛tv | 黄色视屏免费 | 久久久久免费精品国产 | 久久国产经典视频 | 日本一区午夜爱爱 | 久久久久久88色愉愉 | 一级欧美日韩 | 国产成人免费视频精品一区二区 | 国产精品九九视频 | www.碰| 日韩在线 | 中文 | 色吊丝avav色吊丝 | 欧美成人精品福利在线视频 | 免费a级黄毛片 | 久久久青青久久国产精品 | 九九欧美 | 精品国产乱码久久久久久一区二区 | 久久草在线视频播放 | 九九午夜| 一区免费在线观看 | 精品久久久久久 | 国产精品高清视亚洲一区二区 | 久久久免费视频观看 | 国产毛片a | 久久久黄色片 | 久久精品国产精品亚洲 | 欧美日韩一区二区综合在线视频 |