2010-03-27 66 views

回答

17

HereJava的单应用程序实例的例子:

单个实例应用程序是一种只允许到无论用户尝试多少次启动运行的应用程序1。

该应用程序尝试打开特定端口上的套接字。如果您的应用程序的另一个实例已在运行,则打开套接字将失败。

这对您已经足够了,因此您不必使用用于将新应用程序注册到第一个应用程序的代码部分。

与将某种标志写入文件系统/注册表/任何内容相比,使用套接字有一个很大的优势:
即使应用程序崩溃,它也会被删除。

+0

使用套接字似乎是一个非常有用的想法 - 比我提到的文件锁更可靠。 – 2010-03-27 12:31:28

+0

感谢您回复 您给出的解决方案非常完美。 – chetan 2010-03-29 13:31:55

+0

但是使用哪个端口号?就我个人而言,我会在运行时分配一个端口,并且在临时目录中写入一个小文件以保存所选端口号似乎是不可避免的。 – 2011-11-22 08:13:19

1

它实际上听起来像你只想要一个应用程序一次打开。在这种情况下,为什么不在应用程序运行时取出文件锁定或类似内容,并检查启动时是否启动。当你的程序没有完全退出时,头痛(当然)会清除锁定。

1

正如Peter Lang所链接的,我的首选解决方案是使用套接字。当您的应用程序启动时,您可以启动服务器套接字监听localhost上的传入连接(以及您选择的端口)。在代码中发生这种情况之前,您可以尝试连接到服务器套接字,如果成功,您知道还有另一个实例已经打开,因此您可以使用适当的消息退出当前实例。

在您的服务器套接字实现中,您还可以添加在接收传入连接时实际强制应用程序的当前实例到前台的功能。

0
public class Samp { 

    JFrame f=new JFrame(); 
    File ff=new File("D:\\a.txt"); 
    FileWriter fw; 

    public Samp() { 
     f.setBounds(0, 0, 200, 200);  
     try { 
      Scanner sc=new Scanner(ff); 
      if(!sc.hasNext()) {   
       fw=new FileWriter(ff); 
       fw.write("Running"); 
       fw.close(); 
      } else { 
       System.exit(0); 
      } 
     } catch(Exception e) { 
      System.out.println(e.getMessage()); 
     } 

     WindowListener wndCloser = new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       try { 
        Scanner sc = new Scanner(ff); 
        if(sc.hasNext()) { 
         fw=new FileWriter(ff); 
         fw.write(""); 
         fw.close(); 
        } 
       } catch (Exception ex) { } 
      } 
     }; 

     f.setVisible(true); 
     f.addWindowListener(wndCloser); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String args[]) { 
     new Samp(); 
    } 
} 
0

你的意思是运行像一个单身的GUI?我已经在过去通过使静态私有“视图管理器”,使其为空,而不是创建或可见第一次GUI直到做到了这一点在创建之后,就像使用经典单例一样,当应用程序再次运行时,GUI被设置为可见的......我有几个框架遵循此设计 - 在这些框架中,GUI不是“主要”也是命令行和类似的接口,所以通过命令行召唤GUI ...

0

使用单数模式,如example所示!

相关问题