Este es un breve ejemplo sobre como crear un socket para controlar que corra una única instancia de tu app y que se quede escuchando hasta recibir un stop / shutdown para cerrar la aplicación.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Inet4Address;
import java.net.ServerSocket;
import java.net.Socket;

import javax.net.ServerSocketFactory;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
* Socket stop example
* @author peiretti
*
*/
public class SocketStop {

     static Logger logger = Logger.getLogger(SocketStop. class );

    private static int port = 9898;

     public static void main(String[] args) {

         // Log4J
       BasicConfigurator.configure();
        logger .setLevel(Level. DEBUG );

        // Check arguments
        for (String string : args) {
             if ( "stop" .equals(string.toLowerCase()) || "shutdown" .equals(string.toLowerCase()));
            try {
                stop();
                return ;
           }  catch (Throwable e) {
                 return ;
           }
        }

         // --
        // -- inicializo otros servicios (ej. spring) y la applicacion ...
        // ......................... init app swing ...
        // ---

        // -- inicializo el Socket y lo dejo escuchando...
       ServerSocket serverSocket;
        try {
            serverSocket = ServerSocketFactory.getDefault().createServerSocket( port , 2, Inet4Address.getLocalHost());
       }  catch (Exception e) {
             logger .error( "Ya hay otra instacia de la aplicacion en ejecucion" ,e);
            throw new RuntimeException(e);
       }

         while ( true ) {

             final Socket socket;
            try {
                socket = serverSocket.accept();
           }  catch (IOException e) {
                 throw new RuntimeException(e.getMessage(), e);
           }

             try {

                 // ¿se ha recibido stop ?

                final BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()));

                final String line = in.readLine();

                if (line != null && "stop" .equals(line.trim().toLowerCase())) {

                     // se ha recibido stop... entonces break!

                    logger .info( "Se ha Recibido Stop..." );
                    break ;

               }  else {

                     logger .info( "Invalid '" + line + "'" );

               }

            }  catch (IOException ioe) {

                 logger .error(ioe);

           }  finally {
                 try {
                    socket.close();
               }  catch (IOException ioe) {
                     logger .error(ioe);
               }
            }

        }

         // Se ha recibido un stop
        // y se hizo un break dentro del while...

        try {
            serverSocket.close();
       }  catch (IOException e) {
             logger .error(e);
       }

         // --
        // - cerrar aplicacion
        // ...........

       System.exit(0);

        // ----

   }

     /**
     * Envio stop al socket
     */
    private static void stop() throws Throwable {

        Socket socket = new Socket(Inet4Address.getLocalHost(), port );

       PrintWriter out = new PrintWriter(socket.getOutputStream(), true );

        logger .info( "Send stop..." );

       out.write( "stop\n" );

       out.flush();
       out.close();
       socket.close();
   }

}

#mobile app

 Crear un Socket para controlar una sola instancia de tu APP con opción de Shutdown
1.30 GEEK