2010-03-27 14 views

Respuesta

17

Here es un ejemplo de un Java aplicación de instancia única:

Una aplicación de instancia única es uno que sólo permite la 1 de la aplicación se ejecute, no importa cuántas veces el usuario intenta iniciar.

La aplicación intenta abrir un Socket en un puerto específico. En caso de que otra instancia de su aplicación ya se esté ejecutando, la apertura del socket falla.

Esto ya debería ser suficiente para usted, por lo que no tendría que usar la parte del código utilizada para registrar nuevas aplicaciones en la primera iniciada.

El uso de un zócalo tiene una gran ventaja en comparación con escribir algún tipo de indicador en el sistema de archivos/registro/lo que sea:
Se elimina incluso si su aplicación falla.

+0

Usar el socket parece una idea muy útil, mucho más confiable que el bloqueo de archivos que mencioné. –

+0

Gracias por responder La solución dada por usted está funcionando perfectamente. – chetan

+0

¿Pero qué número de puerto usar? Personalmente, asignaría un puerto en tiempo de ejecución, y parece inevitable escribir en un pequeño archivo en el directorio temporal para guardar el número de puerto elegido. –

1

De hecho, parece que solo quiere una aplicación abierta a la vez. En cuyo caso, ¿por qué no sacar un bloqueo de archivo o similar cuando se ejecuta la aplicación y verificarlo al iniciarse? El dolor de cabeza (por supuesto) es la limpieza de ese bloqueo en el caso de que su programa no salga limpiamente.

1

Mi solución preferida es, como Peter Lang vinculada a, usar Sockets. Cuando se inicia la aplicación, puede iniciar un socket de servidor para escuchar las conexiones entrantes en el host local (más el puerto de su elección). Antes de que esto ocurra en su código, puede intentar establecer una conexión con el servidor y si tiene éxito, debe saber que ya hay otra instancia abierta, por lo que puede cerrar la instancia actual con un mensaje apropiado.

En la implementación del socket del servidor también puede agregar la funcionalidad de que al recibir una conexión entrante, se fuerza a la instancia actual de la aplicación al primer plano.

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

¿Te refieres a ejecutar la interfaz gráfica de usuario como un Singleton ?, yo he hecho esto en el pasado haciendo una estática "gestor de vista" privada tal que es nula y no se ha creado o visible hasta que la primera vez que la interfaz gráfica de usuario se crea, después de eso al igual que con un singleton clásico, la GUI se configura como visible cuando la aplicación se ejecuta de nuevo ... Tengo un par de Frameworks que siguen este diseño - En estos marcos, la GUI no es "primaria" allí son también línea de comando y las interfaces similares para que la GUI se invoque a través de la línea de comando ...

0

¡Utilice el patrón Singletone como se muestra en el example!

Cuestiones relacionadas