仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 535|回复: 9
打印 上一主题 下一主题

[学习教程] JAVA网页设计把持运转中的application历程实例的个数...

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:19:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。application|历程|把持
在C++中很简单完成把持使用程序只能运转一个历程实例,在C#中也很好完成,但在java中想要把持程序的实例数就长短常灾难的事变。究其缘故原由,是由于C++和C#都是经由过程向windows注册表写数据来完成历程互斥,但java是跨平台的,不克不及用这类只能针对windows的办法来完成。

由于java中历程之间十分自力,很少有能够共享的工具,以是只要找到能够在历程间共享的工具,才干完成历程的互斥。有两种工具能够用来完成互斥。一是socket端口,一是文件锁。由于利用socket大概会存在端口被占用的成绩,并且,占用收集端口这类原本就很紧俏的资本来完成互斥也是得失相当的。以是我们这里用第二种工具来完成历程互斥:文件锁。

用文件锁来完成互斥另有一个优点,便可以把持历程实例的个数,好比把持只能运转三个实例或四个实例,而不是像一样平常程序一样牢牢只能运转一个实例。

为了用文件锁完成历程实例数的把持,我这里写了一个InstanceCount类。利用办法以下:

intcount=InstanceCount.getInstance().getCount();//猎取本程序以后已在运转中的历程实例数。

然后就能够依据这个count来把持实例数了,好比:

if(count>3)System.exit(0);

不外这里要注重一个成绩,就是java使用程序是由一堆class文件构成的,假如在体系中存在这些class的多个拷贝,我以为它们是属于分歧的application,即只要用统一的class文件所启动的历程才算是统一application的分歧实例。这个界说假如人人不承受,能够修正我的代码以切合人人本人的界说。

此类还必要用到另外一个类Path,这个类在我写的另外一篇文章《猎取类的class文件的相对路径》中有先容:

http://blog.csdn.net/youyue/archive/2005/03/22/326477.aspx

此类的源代码以下:

*创立日期2005-1-26**TODO要变动今生成的文件的模板,请转至*窗口-首选项-Java-代码款式-代码模板*/packagemytools;

importjava.io.File;importjava.io.FilenameFilter;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.nio.channels.FileChannel;importjava.nio.channels.FileLock;

/***这个类能够用来猎取Java程序的实例数。这里的实例是指运转统一个Java程序所发生的历程实例,而所谓“统一个”是指统一份class文件或jar文件,*假如将这些文件复制至其他地位而从头运转所发生的实例,不属于此类所界说的统一个Java程序发生的实例。**@author由月*@version2005-02-01*/publicclassInstanceCount{privateintcount=0;

privatestaticInstanceCounttheInstance=null;

privateFilefilePath=null;

privateFiletempFile=null;//用来标识本实例的一时文件

privateFileChannelfileChannel=null;

privateFileLockfileLock=null;

privateRandomAccessFileraFile=null;

privateInstanceCount()throwsIOException{//公有的机关子,包管此类没法用new操纵符来创立对象。Stringpath=Path.getPathFromClass(this.getClass());//猎取InstanceCount类的class文件地点路径this.filePath=newFile(path);this.filePath=newFile(this.filePath.getParent(),"InstTmp");if(this.filePath.exists()&&this.filePath.isDirectory()){//是不是已存在InstTmp目次getCount();}else{this.filePath.mkdir();}this.tempFile=File.createTempFile("~Inst",".tmp",this.filePath);//创立标识本实例的一时文件this.raFile=newRandomAccessFile(this.tempFile,"rw");this.fileChannel=raFile.getChannel();//取得该文件的FileChannel对象this.fileLock=fileChannel.tryLock();//给一时文件加锁,以包管历程实例的独一性this.tempFile.deleteOnExit();if(this.fileLock!=null){this.count++;//新实例发生,实例总数增添1}else{thrownewIOException();}}

privatevoidgetCountAndMax(){File[]fileList=this.filePath.listFiles(newFilenameFilter(){//猎取InstTmp目次下的一时文件列表publicbooleanaccept(Filedir,Stringname){//这里利用了过滤器,只猎取已被加锁了的.tmp文件的列表try{FiletempFile=newFile(dir,name);RandomAccessFileraFile=newRandomAccessFile(tempFile,"rw");FileChannelfileChannel=raFile.getChannel();//取得该文件的FileChannel对象FileLockfileLock=null;if(InstanceCount.this.tempFile!=null&&name.equals(InstanceCount.this.tempFile.getName())){}else{fileLock=fileChannel.tryLock();}if(tempFile.isFile()&&name.endsWith(".tmp")&&(fileLock==null||fileLock.isValid()==false)){raFile.close();returntrue;}else{fileLock.release();raFile.close();tempFile.delete();//将未加锁的和文件名不准确的文件删撤除returnfalse;}}catch(IOExceptione){e.printStackTrace();returnfalse;}}});this.count=fileList.length;}

/***猎取实例数把持对象。一个历程最多能够猎取一个InstanceCount对象。**@return独一的InstanceCount对象*/publicstaticInstanceCountgetInstance(){if(InstanceCount.theInstance==null){//包管本类在一个程序中只要一个实例try{InstanceCountinstCtrl=newInstanceCount();returninstCtrl;}catch(IOExceptione){returnnull;//假如产生IO非常则前往空值}}else{returnInstanceCount.theInstance;}}

/***猎取正在运转中的实例的个数。**@return实例个数。*/publicintgetCount(){getCountAndMax();returnthis.count;}

protectedvoidfinalize(){try{this.fileLock.release();this.fileChannel.close();this.raFile.close();this.tempFile.delete();this.filePath.delete();}catch(IOExceptione){}}

publicstaticvoidmain(String[]args){try{InstanceCountic=InstanceCount.getInstance();System.out.println(ic.getCount());Thread.sleep(5000);}catch(Exceptione){e.printStackTrace();}}}

再举这样一个例子:如果你想对一个数字取绝对值,你会怎么做呢?java的做法是intc=Math.abs(-166);而ruby的做法是:c=-166.abs。呵呵,这就看出了java与ruby的区别。
谁可相欹 该用户已被删除
沙发
发表于 2015-1-20 20:24:47 | 只看该作者
是一种使用者不需花费很多时间学习的语言
admin 该用户已被删除
板凳
发表于 2015-1-29 20:51:29 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
变相怪杰 该用户已被删除
地板
 楼主| 发表于 2015-2-1 10:15:38 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
爱飞 该用户已被删除
5#
发表于 2015-2-8 07:21:01 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
深爱那片海 该用户已被删除
6#
发表于 2015-2-24 21:51:49 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
小魔女 该用户已被删除
7#
发表于 2015-3-7 13:46:37 | 只看该作者
是一种突破用户端机器环境和CPU
山那边是海 该用户已被删除
8#
发表于 2015-3-10 13:00:27 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-12 22:14:37 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
第二个灵魂 该用户已被删除
10#
发表于 2015-3-20 03:51:39 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 09:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表