`
猜不透
  • 浏览: 133380 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

让java程序只运行一个实例

阅读更多

最近做了个java项目,功能完成后打包安装了,发现可以点开多个实例,因为桌面显示托盘,所以点一次就会出现一个托盘,并且系统也多了好几个javaw进程,这样的话就不能保证程序的健壮性了,所以要做一个判断让程序只运行一个实例。

要求只能运行一个实例,并且保证javaw进程只有一个,之前通过查资料发现有两种方式,一种是使用端口号控制的方式,先创建端口,运行的时候再判断端口是否被占用来判断是否启动新实例,第二种是文件锁的方式,这种方式的用法在于运行程序的时候将文件上锁,然后判断这个文件是否被锁来看是否要运行一个新实例,因为没找到合适的解决方式,所以文件锁的方式被我pass掉了,然后再看到的是使用端口号+文件的方式,这种方式的用法在于启动的时候创建一个文件,关闭的时候删掉这个文件,当然仅仅这么一个操作不能起上诉要求的,如果非法关闭的话,文件还存在就不能满足要求,只能是再加上一个端口的控制,即当端口被占用并且文件存在的情况下就停止运行新实例,否则启动一个实例,经试验这种方式可以得到满足

以下是代码:

public static void main(String[] args) throws IOException {

//创建lock.java文件

String filePath = new File("IDRCallDll").getAbsolutePath().substring(0,

new File("IDRCallDll").getAbsolutePath().lastIndexOf("\\"));

File getFile = new File(filePath + "\\" + "lock.java");

System.out.println(getFile.getPath());

//判断端口是否被占用

boolean flag=isLoclePortUsing(20520);

System.out.println(flag);

//如果文件存在并且端口被占用则退出

if (getFile.exists()&& flag) {

new MyTray().showDialog();

System.exit(0);

}

try {

Socket sock = new Socket("127.0.0.1", 20520);// 创建socket,连接20520端口

} catch (Exception e) {

System.out.println("端口被占用!");

}

final Class<?> clazz = (Class<?>) JavaCall.class;

final boolean isWindows = System.getProperty("os.name").contains(

"Windows");

final List<String> args1 = new ArrayList<String>();

args1.add(isWindows ? "javaw" : "java");

args1.add("-Xmx" + 128 + "M");

args1.add("-cp");

args1.add(System.getProperty("java.class.path"));

args1.add("-Djava.library.path="

+ System.getProperty("java.library.path"));

args1.add(clazz.getCanonicalName());

// logger.info("start " + args1.toString());

final ProcessBuilder pb = new ProcessBuilder(args1);

pb.redirectErrorStream(true);

 

try {

/**

* 读身份证信息程序

*/

pb.start();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

RandomAccessFile r = new RandomAccessFile(

filePath + "\\" + "lock.java", "rws");

FileChannel temp = r.getChannel();

FileLock fl = temp.lock();

}

/**

* 判断端口是否被占用

* @param port

* @return

*/

public static boolean isLoclePortUsing(int port){  

        boolean flag = true;  

        try {  

            flag = isPortUsing("127.0.0.1", port);  

        } catch (Exception e) {  

        }  

        return flag;  

    }  

public static boolean isPortUsing(String host,int port) throws UnknownHostException{  

       boolean flag = false;  

       InetAddress theAddress = InetAddress.getByName(host); 

       System.out.println(theAddress);

       try {  

       ServerSocket socket = new ServerSocket(port);  

           flag = true;  

       } catch (IOException e) {  

             System.out.println("beizhanyong");

       }  

       return flag;  

   }  

分享到:
评论

相关推荐

    如何使应用程序只运行一个实例(11kb)

    综上所述,创建一个只运行一个实例的应用程序涉及到多种技术和策略,包括进程管理、并发控制、系统资源的使用以及错误处理等。通过合理地运用这些技术,可以确保应用程序始终以最优化的方式运行,提供更好的用户体验...

    清华Java程序设计实例教程

    例如,在《清华Java程序设计实例教程》中,可能涉及到创建一个名为"Student"的类,包含姓名、年龄等属性,以及获取和设置这些属性的方法。 2. 主函数:Java程序的入口点是main()函数。"public static void main...

    一个Java程序实例

    例如,一个名为`main`的方法,其声明为`public static void main(String[] args)`,是Java程序的入口点。程序的执行始于`main`方法,因此它是任何Java应用程序的起点。 此外,学习如何处理异常也是Java编程中的重要...

    java 小程序,共140个实例

    这个"java小程序,共140个实例"的压缩包显然旨在为初学者提供一个丰富的学习资源,帮助他们通过实践理解Java编程的核心概念。下面将详细阐述Java编程的一些关键知识点,并与这些实例相结合进行讨论。 1. **基础语法...

    java程序设计技巧1001个实例

    在"Java程序设计技巧1001个实例"中,我们可以深入学习如何利用Java进行高效的程序开发。这个资料集涵盖了从基础到高级的Java编程技巧,通过1001个实例,帮助开发者巩固和提升技能。 1. **基础概念**:Java的基础...

    Java程序设计技巧与开发实例

    异常处理是Java中一个重要的错误处理机制,通过try-catch-finally结构可以捕获并处理运行时异常。学习者应熟悉不同类型的异常,如检查异常和运行时异常,以及何时使用throws关键字。 在实际开发中,设计模式是解决...

    程序只运行一个实例,并将前一个实例提到前台

    标题中的“程序只运行一个实例,并将前一个实例提到前台”指的是单例模式的应用,这是一种设计模式,确保一个类只有一个实例并且提供一个全局访问点。在很多应用中,比如设置程序、后台服务或者某些配置管理类,我们...

    java简单实例程序源代码

    10. **ch6**: 可能讲解了多态性,这是面向对象编程的一个核心概念,允许父类引用指向子类对象,增强了代码的灵活性和重用性。 通过研究这些章节的源代码,学习者可以深入理解每个知识点的实际应用,并通过实践来...

    java 获取程序运行环境的信息

    在Java编程语言中,获取程序运行环境的信息是十分常见的需求,这有助于开发者了解程序的运行状态,调试问题,或者根据不同的环境配置进行条件判断。Java提供了丰富的类库和方法来获取这些信息,主要包括JVM(Java...

    JAVA程序实例(视频)

    这个小程序展示了如何在JAVA中输出文本,理解main方法的含义,以及如何运行一个简单的JAVA程序。这对于初学者来说是理解JAVA程序执行流程的关键。 接着,【swing图形设计实例运行】涉及JAVA的GUI(图形用户界面)...

    java入门 应用程序实例

    5. **异常处理**:Java提供了强大的异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行时可能出现的问题,确保程序的健壮性。 6. **输入/输出(I/O)**:Java的I/O库提供了读写文件、网络通信等功能。...

    100个实例的Java源程序

    3. **异常处理**:Java中的try-catch-finally结构用于处理程序运行时可能出现的错误。实例可能会演示如何捕获和处理异常,以确保程序的健壮性。 4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet...

    Java常用实例程序

    多态则指一个接口可以有多种不同的实现,增强了灵活性。 4. **异常处理**:Java通过try-catch-finally结构来捕获和处理运行时错误,确保程序的稳定性和健壮性。 5. **集合框架**:Java集合框架包括List(如...

    Java程序多进程运行模式的实例分析

    ### Java程序多进程运行模式的实例分析 #### 一、多进程的概念与优势 在Java中,多进程是指在一个程序中启动多个独立的Java虚拟机(JVM)实例,每个实例都可以独立运行自己的任务。这种方式相比于单进程具有以下优势...

    JAVA实例程序

    通过实例,你可以看到如何编写简单的Java程序并理解它们的工作原理。 2. **类与对象**:Java是面向对象的语言,所以理解和创建类与对象至关重要。实例中会包含创建类、实例化对象、封装、继承和多态等OOP概念的示例...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    Java程序设计与实例源代码

    Java程序设计是软件开发领域中的重要一环,它是一种面向对象的编程语言,以其平台无关性、安全性以及高效性等特点,被广泛应用于企业级应用、移动应用、游戏开发、大数据处理等多个领域。本资料包“Java程序设计与...

    Java程序实例 包括Java各知识点的实例

    这个压缩包文件"Java程序实例 包括Java各知识点的实例"提供了丰富的Java编程实践,非常适合初学者和进阶者深入理解Java的核心概念。下面将详细阐述Java的一些关键知识点。 1. **基础语法**: Java的基础语法包括变量...

    java调用c c++程序实例

    5. 运行Java程序,调用native方法。 通过这种方式,开发者可以利用Java的高级特性同时利用C/C++的高效性能,实现两者的完美结合。在实际应用中,这常用于图形处理、硬件访问、高性能计算等场景。

Global site tag (gtag.js) - Google Analytics