JAVA是平台无关的,这也就决定了它不能太深地涉及OS的底层。如果说JAVA有缺点,那么就是在这里了。但是在某些情况下我们又不得不要操作一些系统的底层,JAVA在这方面给我们造成了很大的不便。尽管现在有很多的开源项目可以实现一些平台底层的功能,如JDIC(现在已经大部分被吸收到JDK当中来) 等,但不能完全满足我们的要求,况且这像是一个大菜市场:得靠自己选。
很多情况我们需要在一个OS中只有一个实例运行,可是又不能像C++一样写内存标志,怎么办呢?以前我想过很多办法:注册系统标志、建立标志文件等等很多手段,要么实现复杂要么不稳定,比如建立标志文件:如果JVM被不正常终止或者OS断电等情况,临时文件没有被删除,下次启动程序时就会误以为已经有程序在运行而退出。突然想出来一个办法,实现起来很简单,而且几乎没有哪一个OS不支持的:那就是网络资源。
任意一个网络端口在OS当中总是唯一的,我们从这一点入手。如果有端口被监听,如果再去监听它,那么一定会失败。可是有时候并不是被这个程序监听呢?麻烦就来了。我们总会有办法:可以监听多个端口,只要有一个端口是可以用的,说明该程序还没有被运行。在程序的入口切入如下代码:
import
javax.swing.
*
;
import
java.net.
*
;

public
class
test
{
public static void main(String[] args)
{
boolean isRun=true;
//判断是否已有实例运行
try{
ServerSocket s2=new ServerSocket(60121);
isRun=false;
}
catch(Exception ex)
{
isRun=isRun||true;
}
//第二次判断 并且可以如此下去 但是会造成不必要的资源浪费 建议监听两个端口即可 而且端口尽量设大一点。
try{
ServerSocket s1=new ServerSocket(60122);
isRun=false;
}
catch(Exception ex)
{
isRun=isRun||true;
}
if(isRun) //如果已有实例在运行
{
JOptionPane.showMessageDialog(null,"已经有一个实例正在运行!","运行失败",JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
else
{
System.out.println("这里是程序的运行主体。");
}
}
}
好啦,运行一个实例就实现了,你试试吧!
很多情况我们需要在一个OS中只有一个实例运行,可是又不能像C++一样写内存标志,怎么办呢?以前我想过很多办法:注册系统标志、建立标志文件等等很多手段,要么实现复杂要么不稳定,比如建立标志文件:如果JVM被不正常终止或者OS断电等情况,临时文件没有被删除,下次启动程序时就会误以为已经有程序在运行而退出。突然想出来一个办法,实现起来很简单,而且几乎没有哪一个OS不支持的:那就是网络资源。
任意一个网络端口在OS当中总是唯一的,我们从这一点入手。如果有端口被监听,如果再去监听它,那么一定会失败。可是有时候并不是被这个程序监听呢?麻烦就来了。我们总会有办法:可以监听多个端口,只要有一个端口是可以用的,说明该程序还没有被运行。在程序的入口切入如下代码:






































好啦,运行一个实例就实现了,你试试吧!