Java » Evitar que un programa Java se cargue dos veces
Algunos de vosotros nos habéis preguntado sobre cómo controlar que un programa Java se cargue dos veces. Es decir, que si ya lo hemos lanzado, evitemos que se vuelva a lanzar.
Existen formas desde Java Web Start y el modo SingleInstanceService para evitar que un programa se cargue dos veces. Pero en nuestro caso vamos a realizarlo de una forma "más manual" en Java, pero muy efectiva.
El truco es que el programa Java cree un objeto que esté escuchando a un puerto específico del ordenador. Para ello utilizamos un ServerSocket, objeto que nos permite crear un objeto escuchando a un determinado puerto.
Escoge un puerto que no sea el estándar de los protocolos: 80 para el http, 21 para el ftp,... Vamos elige un número de puerto "raro".
Además vemos que el objeto ServerSocket que hemos instanciado es un objeto estático dentro de nuestro programa. Así, nuestro programa tendrá un listener sobre un puerto, al que nadie dirá nada, pero que lo dejará como reservado.
Lo que sucede es que si intentamos volver a crear un escuchador sobre ese puerto, saldrá una excepción indicando que el puerto ya está en uso. Esto nos permite controlar que ya hay una instancia de nuestro programa ejecutándose.
try { }
Con este simple código podemos evitar que un programa Java se ejecute dos veces.









febrero 22, 2012 #
Información Bitacoras.com…
Valora en Bitacoras.com: Algunos de vosotros nos habéis preguntado sobre cómo controlar que un programa Java se cargue dos veces. Es decir, que si ya lo hemos lanzado, evitemos que se vuelva a lanzar. Existen formas desde Java Web Start y el modo S……
febrero 23, 2012 #
Mil gracias amigo !!!!!!!!!!!!
Me sirvió perfectamente, te lo agradezco.
febrero 23, 2012 #
@Héctor,
Me alegro enormemente que te haya servido.
marzo 5, 2012 #
[...] los artículos tenemos una mezcla de peticiones de usuarios, como Evitar que un programa Java se cargue dos veces o artículos con novedades como Crear contenido editable en HTML5. Espero que sean de vuestro [...]
marzo 9, 2012 #
Hola Víctor, excelente tutorial, funciona de maravilla, los java consumen muchos recursos y nos ralentizan la web, de esta forma evitamos que se cargue el java varia veces, y el usuario tendrá una navegación más placentera. Saludos
marzo 9, 2012 #
@Jhonatan, muchas gracias por el comentario.
marzo 13, 2012 #
Hola Víctor, otra ves aquí molestando, una ves que implemente el código me funciono de maravilla pero con las modificaciones que me piden(que nunca van a terminar)implemente un reloj en tiempo real en donde hago uso de un Thread, el problema es de cuando ejecuto la aplicación me vota la excepción de que mi aplicación ya esta en proceso, creo que es a consecuencia del uso del Thread hay otra forma de poder validar si el programa se carga otra ves?. ya intente cambiando de puerto y nombre al socket pero no funciona alguna idea que me puedas dar para solucionar esto, de antemano muchas gracias.
marzo 28, 2012 #
Hola, muy buen aporte, pero quisiera saber si me pudieras decir como hacer que cuando se ejecute por segunda vez te muestre el que ya esta abierto? de antemano muchas gracias por tu ayuda!
marzo 28, 2012 #
Que tal Juan, lo que puedes hacer es poner un JOptionPane informando al usuario de que ya esta abierto, yo lo tengo así:
private void validaapertura(){
try {
SERVER_SOCKETE = new ServerSocket(1779);
System.out.println(“Es la primera instancia de la aplicación…”);
} catch (IOException x) {
System.out.println(“Otra instancia de la aplicación se está ejecutando…”);
//Informo al usuario
JOptionPane.showMessageDialog(null, “EL SISTEMA YA SE ENCUENTRA EN EJECUCIÓN !!!”,”PRECAUCIÓN”,JOptionPane.WARNING_MESSAGE);
//En esta parte cierro la segunda instancia de la aplicación que se intenta abrir
System.exit(0);
}
}//fin de mi método valida apertura
Espero y te sirva este ejemplo…
Saludos
marzo 28, 2012 #
Muchas gracias por tu pronta respuesta
Me diste una gran idea, Gracias y Saludos!!!