电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

讓Java程序只運行一個實例

瀏覽:58日期: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
相關文章:
主站蜘蛛池模板: 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 天津仓库出租网-天津电商仓库-天津云仓一件代发-【博程云仓】 | 北京律师咨询_知名专业北京律师事务所_免费法律咨询 | 棉服定制/厂家/公司_棉袄订做/价格/费用-北京圣达信棉服 | 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 天长市晶耀仪表有限公司| 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 对辊式破碎机-对辊制砂机-双辊-双齿辊破碎机-巩义市裕顺机械制造有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 九州网址_专注于提供网址大全分享推广中文网站导航服务 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 聚氨酯复合板保温板厂家_廊坊华宇创新科技有限公司 | 苏州西装定制-西服定制厂家-职业装定制厂家-尺品服饰西装定做公司 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 旋转气浴恒温振荡器-往复式水浴恒温振荡器-金怡百科 | 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 鑫达滑石-辽宁鑫达滑石集团 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 烽火安全网_加密软件、神盾软件官网 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 酒瓶_酒杯_玻璃瓶生产厂家_徐州明政玻璃制品有限公司 |