模仿C++唯一实例实现

来源:互联网 发布:bootstrap modal.js 编辑:程序博客网 时间:2024/05/21 18:17
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(
"这里是程序的运行主体。");
        }

    }

}



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