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.
private static ServerSocket SERVER_SOCKET;
SERVER_SOCKET = new ServerSocket(1334);
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 {
SERVER_SOCKET = new ServerSocket(1334);
System.out.println("Es la primera instancia de la aplicación...");
System.out.println("Pulsa OK para terminar");
System.in.read();
} catch (IOException x) {
System.out.println("Otra instancia de la aplicación se está ejecutando...");
}
Con este simple código podemos evitar que un programa Java se ejecute dos veces.