用文件锁或者端口控制: 在你需要控制的程序中加入new InstanceControl().start();就可以了。 public class InstanceControl 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(); } } }
是不是用不着那么复杂啊?在myhotsun(科科) 写的代码中添加private static OnlyOne _instance; private static Object Lock=new Object();//add new private OnlyOne(){}//add new ………… if (_instance==null) { synthorized(Lock){ //add new _instance = new OnlyOne();
} } 是不是就可以了阿?用类本身来保证实例的唯一性,用private定义它的构造方法
再次强调:单例模式没用。这是两个不同jvm下的程序。
if(ic.isRunning()) 为什么用在我的程序中要 if (!ic.isRunning()) 呢
if (!ic.isRunning()) 那就是上面的程序判断时搞反了,你自己看一下吧。我认为用端口实在是杀鸡用牛刀了呀:)
启动是写文件这个部分是不是要做io操作
我的io学的不是很好
如果想跳过这步有什么方法不??
public class OnlyOne {
private static OnlyOne _instance;
private OnlyOne() {
System.out.println("ok");
}
public static final OnlyOne getInstance() {
if (_instance==null) {
_instance = new OnlyOne();
}
else {
System.out.println("run already");
}
return _instance;
}
}
import java.io.*;
import javax.swing.JOptionPane;//应用实例控制类
public class InstanceControl
{
FileLock lock=null;
//判断该应用是否已启动
public boolean isRunning()
{
try
{
//获得实例标志文件
File flagFile=new File("instance");
//如果不存在就新建一个
if(!flagFile.exists())flagFile.createNewFile();
//获得文件锁
lock=new FileOutputStream("instance").getChannel().tryLock();
//返回空表示文件已被运行的实例锁定
if(lock==null)return false;
}catch(Exception ex){ex.printStackTrace();}
return true;
} public static void main(String[] args)
{
InstanceControl ic=new InstanceControl();
if(ic.isRunning())
JOptionPane.showMessageDialog(null,"已存在该程序的实例!","提示",JOptionPane.OK_OPTION);
else
MainClass.main(args);
}
}
在你需要控制的程序中加入new InstanceControl().start();就可以了。
public class InstanceControl
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();
}
}
}
private static Object Lock=new Object();//add new
private OnlyOne(){}//add new
…………
if (_instance==null) {
synthorized(Lock){ //add new
_instance = new OnlyOne();
}
}
是不是就可以了阿?用类本身来保证实例的唯一性,用private定义它的构造方法
为什么用在我的程序中要
if (!ic.isRunning())
呢
那就是上面的程序判断时搞反了,你自己看一下吧。我认为用端口实在是杀鸡用牛刀了呀:)