Problemas al intentar cerrar el programa

Saludos , la historia es la siguiente : cuando ejecuto el programa he intento cerrarlo con un botón que contiene este código ( System.exit(-1); ) o con otro botón con el siguiente código :

try{
Process p = Runtime.getRuntime().exec("cmd /c start " + "c:\\close.bat");
p.waitFor();
}catch(Exception ex){

}

NOTA : el .bat lo que hace es matar el proceso e intento cerrar el programa antes de que realice todo lo que tiene que hacer, seria como un cancelar.

La cuestión es que no puedo ejecutar ningún botón porque se me queda la interfaz bloqueada cuando le doy al botón y empieza el programa a hacer su función.

1 - ¿Hay alguna forma de parar la aplicación?

2 - Si el programa funciona a la perfección en cuanto a lo que se le pide y solo me falla eso , a que se puede deber...?

Saludos y gracias de antemano , si necesitáis más información comunicármelo gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Process...?

El .bat que corres con el Process, lo que hace es matar el programa que lo corrió?

Es una aplicación Swing? El System.exit() debe funcionar, hice este código y no tiene ningún problema:

import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Cierra implements ActionListener {

  public void actionPerformed(ActionEvent event) {
    System.exit(0);
  }

  public static void main(String[] args) {
    JFrame ventana = new JFrame("Prueba de cerrar");
    JButton boton = new JButton("Cierrame");
    boton.addActionListener(new Cierra());
    ventana.getContentPane().add(boton);
    ventana.setVisible(true);
  }

}

Investiga si la versión de Java que estás usando tiene algún problema conocido con eso; si puedes actualiza tu versión (aunque sea a la versión menor más reciente de la versión mayor que usas). Prueba tu programa en otro equipo con un sistema operativo distinto (una versión distinta de Windows aunque sea).

Sin Resolver

He estado buscando información y parece que al ser un proceso de larga duración, básicamente con el programa actualizo unos 3600 + artículos , manejando imágenes, descripciones, base de datos y demás. Por lo que cuando ejecuto la aplicación y empieza a trabajar el programa se queda colapsada la interfaz gráfica , aunque el programa siga haciendo su función , cualquier código que ponga aunque este bien no se puede ejecutar dado que no puedes hacer click en ningún botón ni nada para que ejecute el código. Supongo que será normal porque trabaja con varios datos, nose , si alguien sabe como solucionarlo o le ha pasado alguna vez, si me puede decir por donde andan los tiros se lo agradeceré. Gracias ezamudio por tu rapidez y por compartir tus conocimientos.

Saludos y gracias otra vez

Imagen de ezamudio

waitFor()

El problema es que invocas waitFor() y ese método causa que se trabe el Thread donde lo invocas hasta que el proceso externo termine.

Si tu programa necesita notificación de que el proceso externo ya terminó pero mientras tanto quieres dejar que el usuario haga otras cosas, puedes invocar el waitFor() desde un Thread separado y que después se invoque algún método tuyo para saber que ya terminó. Por ejemplo:

final Process proc = Runtime.getRuntime().exec("blabla");
Runnable r = new Runnable(){
  public void run() {
    proc.waitFor();
    avisarUsuarioFinProcesoExterno(proc);
  }
};
//Corremos esto en un Thread separado
Thread t = new Thread(r, "extproc");
t.start();
//Aqui continua tu codigo que seguramente le devuelve control a Swing (asumiendo que usas Swing)

//Y en algun otro lado de tu clase defines este metodo
public void avisarUsuarioFinProcesoExterno(Process p) {
  //Aqui puedes presentar un JOptionPane para avisar que ya estuvo...
  //Puedes checar el valor de salida del proceso externo (0 es salida normal)
  int salida = p.exitValue();
}