我们先来看看第一种情况是如何实现的,也就是说如果系统中已经存在运行实例的话,那么结束原有的运行实例,让新实例运行。这个实现实例控制的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();