最近做了个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;
}
相关推荐
综上所述,创建一个只运行一个实例的应用程序涉及到多种技术和策略,包括进程管理、并发控制、系统资源的使用以及错误处理等。通过合理地运用这些技术,可以确保应用程序始终以最优化的方式运行,提供更好的用户体验...
例如,在《清华Java程序设计实例教程》中,可能涉及到创建一个名为"Student"的类,包含姓名、年龄等属性,以及获取和设置这些属性的方法。 2. 主函数:Java程序的入口点是main()函数。"public static void main...
例如,一个名为`main`的方法,其声明为`public static void main(String[] args)`,是Java程序的入口点。程序的执行始于`main`方法,因此它是任何Java应用程序的起点。 此外,学习如何处理异常也是Java编程中的重要...
这个"java小程序,共140个实例"的压缩包显然旨在为初学者提供一个丰富的学习资源,帮助他们通过实践理解Java编程的核心概念。下面将详细阐述Java编程的一些关键知识点,并与这些实例相结合进行讨论。 1. **基础语法...
在"Java程序设计技巧1001个实例"中,我们可以深入学习如何利用Java进行高效的程序开发。这个资料集涵盖了从基础到高级的Java编程技巧,通过1001个实例,帮助开发者巩固和提升技能。 1. **基础概念**:Java的基础...
异常处理是Java中一个重要的错误处理机制,通过try-catch-finally结构可以捕获并处理运行时异常。学习者应熟悉不同类型的异常,如检查异常和运行时异常,以及何时使用throws关键字。 在实际开发中,设计模式是解决...
标题中的“程序只运行一个实例,并将前一个实例提到前台”指的是单例模式的应用,这是一种设计模式,确保一个类只有一个实例并且提供一个全局访问点。在很多应用中,比如设置程序、后台服务或者某些配置管理类,我们...
10. **ch6**: 可能讲解了多态性,这是面向对象编程的一个核心概念,允许父类引用指向子类对象,增强了代码的灵活性和重用性。 通过研究这些章节的源代码,学习者可以深入理解每个知识点的实际应用,并通过实践来...
本资源“java程序设计例题全集”显然是一份涵盖了大学Java程序设计课程中各种实例的集合,旨在帮助学习者深入理解和掌握Java编程。 标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践...
这个小程序展示了如何在JAVA中输出文本,理解main方法的含义,以及如何运行一个简单的JAVA程序。这对于初学者来说是理解JAVA程序执行流程的关键。 接着,【swing图形设计实例运行】涉及JAVA的GUI(图形用户界面)...
5. **异常处理**:Java提供了强大的异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行时可能出现的问题,确保程序的健壮性。 6. **输入/输出(I/O)**:Java的I/O库提供了读写文件、网络通信等功能。...
3. **异常处理**:Java中的try-catch-finally结构用于处理程序运行时可能出现的错误。实例可能会演示如何捕获和处理异常,以确保程序的健壮性。 4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet...
多态则指一个接口可以有多种不同的实现,增强了灵活性。 4. **异常处理**:Java通过try-catch-finally结构来捕获和处理运行时错误,确保程序的稳定性和健壮性。 5. **集合框架**:Java集合框架包括List(如...
### Java程序多进程运行模式的实例分析 #### 一、多进程的概念与优势 在Java中,多进程是指在一个程序中启动多个独立的Java虚拟机(JVM)实例,每个实例都可以独立运行自己的任务。这种方式相比于单进程具有以下优势...
通过实例,你可以看到如何编写简单的Java程序并理解它们的工作原理。 2. **类与对象**:Java是面向对象的语言,所以理解和创建类与对象至关重要。实例中会包含创建类、实例化对象、封装、继承和多态等OOP概念的示例...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Java程序设计是软件开发领域中的重要一环,它是一种面向对象的编程语言,以其平台无关性、安全性以及高效性等特点,被广泛应用于企业级应用、移动应用、游戏开发、大数据处理等多个领域。本资料包“Java程序设计与...
这个压缩包文件"Java程序实例 包括Java各知识点的实例"提供了丰富的Java编程实践,非常适合初学者和进阶者深入理解Java的核心概念。下面将详细阐述Java的一些关键知识点。 1. **基础语法**: Java的基础语法包括变量...
5. 运行Java程序,调用native方法。 通过这种方式,开发者可以利用Java的高级特性同时利用C/C++的高效性能,实现两者的完美结合。在实际应用中,这常用于图形处理、硬件访问、高性能计算等场景。