一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的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();
}
}
}
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();
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器