有没有办法只运行一个Java应用程序实例,所以只有一个进程? 。是否有可能在java中做到这一点?
答案 0 :(得分:8)
拥有一个实例的一种简单方法是使用服务端口。
ServerSocket ss = new ServerSocket(MY_PORT);
使用此方法而不是锁定文件的好处是您与已经运行的实例进行通信,甚至检查它是否正常工作。例如如果你无法启动服务器套接字,请使用普通的Socket向其发送“为我打开文件”这样的消息
答案 1 :(得分:2)
执行此操作的最简单方法是在应用程序启动时在磁盘上创建锁定文件,如果文件不存在则正常运行。如果文件存在,您可以假设应用程序的另一个实例正在运行并退出并显示一条消息。假设我理解你的问题。
答案 2 :(得分:1)
如果您的意思是“运行一个应用程序实例”,那么可以使用锁定文件来实现。当您的应用程序启动时,创建一个文件并在程序退出时将其删除。在启动时,检查锁定文件是否存在。如果文件存在,则只需退出,因为应用程序的另一个实例已在运行。
答案 3 :(得分:1)
您可以在启动时打开套接字。如果套接字正在使用中,则可能已经有一个应用程序实例正在运行。锁定文件可以使用,但如果您的应用程序崩溃而没有删除锁定文件,则必须先手动删除该文件,然后才能再次启动该应用程序。
答案 4 :(得分:-4)
您可以应用 Singleton Pattern
Following are the ways to do it:
<强> 1。私有构造函数和同步方法
public class MyClass{
private static MyClass unique_instance;
private MyClass(){
// Initialize the state of the object here
}
public static synchronized MyClass getInstance(){
if (unique_instance == null){
unique_instance = new MyClass();
}
return unique_instance;
}
}
<强> 2。私有构造函数并在声明期间初始化静态实例
public class MyClass{
private static MyClass unique_instance = new MyClass() ;
private MyClass(){
// Initialize the state of the object here
}
public static MyClass getInstance(){
return unique_instance;
}
}
第3。仔细检查锁定
public class MyClass{
private static MyClass unique_instance;
private MyClass(){
// Initialize the state of the object here
}
public static MyClass getInstance(){
if (unique_instance == null)
synchronized(this){
if (unique_instance == null){
unique_instance = new MyClass();
}
}
return unique_instance;
}
}
You can also implement a class with
静态方法和静态变量应用单例模式,但不建议使用。