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

您的位置:首頁技術(shù)文章
文章詳情頁

讓Java程序只運(yùn)行一個實(shí)例

瀏覽:26日期:2024-07-02 15:43:21
內(nèi)容: 一個程序可以在內(nèi)存里面存在多個運(yùn)行實(shí)例,比如,你可以打開多個微軟的Word程序。但是,有些時候我們需要控制程序運(yùn)行的實(shí)例只有一個,也就是說,該程序同一時刻在內(nèi)存里面運(yùn)行的只有一個實(shí)例。這樣當(dāng)這個程序在內(nèi)存中已經(jīng)存在一個運(yùn)行實(shí)例而用戶又再次運(yùn)行了該程序的時候,有兩種結(jié)果,第一種結(jié)果是結(jié)束目前的運(yùn)行實(shí)例,打開新運(yùn)行的實(shí)例;第二種就是讓新運(yùn)行的實(shí)例退出,原有的運(yùn)行實(shí)例繼續(xù)運(yùn)行。 原理 因?yàn)槿魏螘r候只有一個實(shí)例,所以在實(shí)現(xiàn)這種功能的時候必須借助只能被獨(dú)享的資源。如果我們的程序是基于某個平臺的,那么就可以借助操作系統(tǒng)的內(nèi)核對象來完成,比如Windows操作系統(tǒng)就提供了CreateMutex這個API來創(chuàng)建一個獨(dú)享的內(nèi)核對象。但是因?yàn)橐紤]平臺無關(guān),Java程序的實(shí)例控制不應(yīng)該使用系統(tǒng)的內(nèi)核對象來完成,那么我們就必須找到其它的、可以獨(dú)享的資源。實(shí)際上,一臺機(jī)器無論是在什么操作系統(tǒng)上,網(wǎng)絡(luò)端口都是獨(dú)享的,也就是說基于網(wǎng)絡(luò)端口這個獨(dú)享的原理,我們可以很方便地讓我們的Java程序?qū)崿F(xiàn)在內(nèi)存里面只有一個運(yùn)行實(shí)例這個功能,而且這個功能的實(shí)現(xiàn)是與平臺無關(guān)的。 實(shí)現(xiàn) 我們先來看看第一種情況是如何實(shí)現(xiàn)的,也就是說如果系統(tǒng)中已經(jīng)存在運(yùn)行實(shí)例的話,那么結(jié)束原有的運(yùn)行實(shí)例,讓新實(shí)例運(yùn)行。這個實(shí)現(xiàn)實(shí)例控制的Java類也是一個線程,具體的實(shí)現(xiàn)如下: import java.net.*;public class InstanceControl extends Thread { public void run() { try{ Socket sock = new Socket('127.0.0.1',22222); //創(chuàng)建socket,連接22222端口  } catch (Exception e) {} try{ ServerSocket server = new ServerSocket(22222);//創(chuàng)建socket,在22222端口監(jiān)聽 server.accept(); //等待連接 server.close(); //有連接到來,也就是說有新的實(shí)例 System.exit(0); //這個實(shí)例退出 }catch (Exception e) { e.printStackTrace(); } }} 下面這個Java程序的程序入口是沒有實(shí)例控制功能的: public class ProgramMain { public static void main(String argv[]) { mainFrame frame = new mainFrame(); }} 現(xiàn)在想加入實(shí)例控制,只需要添加兩行代碼,添加后代碼如下所示: public class ProgramMain { public static void main(String argv[]) { InstanceControl ic = new InstanceControl(); ic.start(); mainFrame frame = new mainFrame(); }} 在這個基礎(chǔ)上,要實(shí)現(xiàn)第二種情況,也就是已經(jīng)有實(shí)例運(yùn)行的情況下,新的實(shí)例退出,保持原有的運(yùn)行實(shí)例,就只需要一點(diǎn)小的改動了。具體的實(shí)現(xiàn)如下: import java.net.*;public class InstanceControl2 extends Thread { public void run() { try{ Socket sock = new Socket('127.0.0.1', 22222);//創(chuàng)建socket,連接22222端口 System.exit(0); //連接成功,說明有實(shí)例存在,則退出 }catch (Exception e) {} try{ ServerSocket server = new ServerSocket(22222);//創(chuàng)建socket,連接22222端口 while (true) { server.accept(); //接受連接請求 } }catch (Exception e) { e.printStackTrace(); } }} 這個類的使用方法和第一種情況的那個類是一樣的,只需要在原有的代碼上加入兩行代碼即可: InstanceControl2 ic = new InstanceControl();ic.start(); 擴(kuò)展上面的程序也許有一個小bug,就是如果程序在開始運(yùn)行時ServerSocket監(jiān)聽的端口已經(jīng)被其它程序占用,那么程序的運(yùn)行就會受到影響。所以程序的端口應(yīng)該盡量取得大一些,在這種情況下其它程序占用這個程序使用的端口的概率是可以忽略不計的。同時,還可以做兩種擴(kuò)展,第一種是把端口寫在配置文件中,可通過讀配置文件得到端口,這樣就能夠在其它程序占用目前端口的情況下改變這個程序使用的端口。還有一種是在運(yùn)行的時候用兩個InstanceControl類分別在兩個端口監(jiān)聽,只要有一個InstanceControl類得到連接就做出響應(yīng),這樣兩個端口都被其它程序占用的概率就更加的微乎其微了。 轉(zhuǎn)自: 賽迪網(wǎng) 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
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人毛片免费视频 | 中文字幕亚洲在线 | 视频二区在线观看 | 国产欧美一区二区三区在线看 | 韩国毛片免费看 | 欧美激情性色生活片在线观看 | 国产自产v一区二区三区c | 久久机热综合久久国产 | 国产色手机在线观看播放 | 欧美成人26uuu欧美毛片 | 日韩午夜在线 | 欧美在线观看一区二区三区 | 免费在线观看a | 国产精品三级在线观看 | 国产高清在线 | 久久成人动漫 | 在线亚洲精品中文字幕美乳 | 亚洲激情视频网站 | 91精品综合久久久久m3u8 | 国产91会所洗浴女技师按摩 | 99re7在线精品免费视频 | 99热久久免费精品首页 | 精品一区二区三区四区在线 | 日韩欧美在线视频一区二区 | 中文字幕福利 | 国产精品va一级二级三级 | 亚洲成人影院在线 | 国产高清在线观看视频手机版 | 久久精品国产99久久72 | 欧美成人免费全网站大片 | 久久久久久久国产精品视频 | 日一区二区 | 毛片高清 | 国内自拍视频一区二区三区 | 久久久久亚洲视频 | 日韩国产欧美一区二区三区在线 | 久久久国产高清 | 精品久久国产 | 国产一级片网址 | 成人精品免费网站 | 宫女淫春3在线观 |