Java程序只运行一个实例[转]
2015-03-14 18:19
561 查看
如果希望你的Java程序只能存在一个实例,可以参考下面的用法。
原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729
Java没有提供这样的机制。从操作系统的观点来看,一个启动的Java Application仅仅是一个JVM的运行实例。运行相同Application的两个实例,仅仅是运行两个无关的JVM。
只有让多个运行实例之间有一个既定的通讯机制就可以保证只有一个实例运行。
方案1:使用Java的加锁文件机制,idea相当简单,让运行实例通过java.nio.channels.FileLock获得一个"well-known"文件的互斥锁
问题:平台相关
方案2:使用java.net.ServerSocket
问题:打开服务端口可能会受到防火墙的影响;可能和别的端口冲突
方案3:使用File.createNewFile() and File.deleteOnExit()
来源:·BBS 水木清华站 smth.org·[FROM: 202.108.130.*]
问题:文件可能因为某些原因不能被删除,即使利用Runtime.addShutdownHook()也有可能产生这种情况。
原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729
Java没有提供这样的机制。从操作系统的观点来看,一个启动的Java Application仅仅是一个JVM的运行实例。运行相同Application的两个实例,仅仅是运行两个无关的JVM。
只有让多个运行实例之间有一个既定的通讯机制就可以保证只有一个实例运行。
方案1:使用Java的加锁文件机制,idea相当简单,让运行实例通过java.nio.channels.FileLock获得一个"well-known"文件的互斥锁
import java.io.*; import java.nio.channels.*; public class OneInstance_1 { public static void main(String[] args) throws Exception { FileLock lck = new FileOutputStream("C:\\flagFile").getChannel().tryLock(); if(lck == null) { System.out.println("A previous instance is already running...."); System.exit(1); } System.out.println("This is the first instance of this program..."); // Do some work here..... } }
问题:平台相关
方案2:使用java.net.ServerSocket
import java.io.*; import java.net.*; public class OneInstance_2 { private static ServerSocket listenerSocket; public static void main(String[] args) { try { listenerSocket = new ServerSocket(2004); //At this point, no other socket may listen on port 2004. } catch(java.net.BindException e) { System.err.println("A previous instance is already running...."); System.exit(1); } catch(final IOException e) { // an unexpected exception occurred System.exit(1); } // Do some work here..... } }
问题:打开服务端口可能会受到防火墙的影响;可能和别的端口冲突
方案3:使用File.createNewFile() and File.deleteOnExit()
import java.io.*; public class OneInstance_3 { public static void main(String[] args) throws Exception { File flagFile = new File("C:\\flagFile"); if(false == flagFile.createNewFile()) { System.out.println("A previous instance is already running...."); System.exit(1); } flagFile.deleteOnExit(); System.out.println("This is the first instance of this program..."); // Do some work here..... } }
来源:·BBS 水木清华站 smth.org·[FROM: 202.108.130.*]
问题:文件可能因为某些原因不能被删除,即使利用Runtime.addShutdownHook()也有可能产生这种情况。
相关文章推荐
- 让Java程序只运行一个实例
- Java Swing 每次打开只运行一个实例,并激活任务栏里的程序
- 一个ubuntu下运行java程序的实例
- java 桌面程序 只运行一个实例(单例)
- 让你的Java程序只有一个进程实例在运行
- 让Java程序只运行一个实例(两种方法都好用)
- 让Java程序只运行一个实例
- java.net.ServerSocke让java程序只运行一个实例
- 让Java程序只运行一个实例
- 如何让Java程序只运行一个实例
- 利用互斥对象实现一个程序只运行一个实例的方法.
- 用C#给程序加启动画面并只允许一个应用程序实例运行
- Java程序运行结果输出到一个文件中去,结果显示乱码
- MFC程序只能运行一个实例
- 程序只运行一个是实例
- 怎样使程序只运行一个实例
- 控制一个 Java 程序运行生命周期结束前不能再次被执行
- 用C#给程序加启动画面并只允许一个应用程序实例运行
- C#建立了一个windows程序,如何防止多个程序实例运行?
- 让程序只运行一个实例的方法