2010-07-19 20 views

Respuesta

6

No debe llamar al System.exit() si puede evitarlo.

La mejor manera de salir de un proceso de Java es dejar que todos los hilos salgan normalmente. Esto terminará la VM.

En su principal JFrame, debe setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE).

Luego puede llamar al frame.dispose() para cerrar el JFrame y salir del EDT.

+3

¿no debería ser 'DISPOSE_ON_EXIT'? El uso de 'EXIT_ON_CLOSE' también provocará la muerte de los hilos en ejecución, lo que no les permitirá salir normalmente (cuando el usuario cierra el JFrame). –

+2

No estoy de acuerdo. El GC tardaría un tiempo antes de que las cosas se completen y la aplicación salga. No hay nada de malo en llamar a System.exit, una vez que haya tratado de cerrar lo que debería. Los archivos, las tomas de corriente y tan cerca solo se encuentran solos después de llamar a System.exit. – Mike

5

Como la VM termina después de la llamada System.exit(), no creo que haya ninguna diferencia desde qué hilo se está realizando la llamada.

+0

Estoy de acuerdo. Como exit() elimina todo lo que está en su camino, realmente no debería importar qué hilo lo llame. – f1sh

1

System.exit() termina no en los hilos en ejecución, sino en la propia máquina virtual. Por lo tanto, se puede invocar desde cualquier hilo, el resultado es siempre el mismo, y si la máquina virtual muere, todos los posibles estados inconscientes en los hilos serán inexistentes a la vez.

3

Puedes llamarlo desde cualquier subproceso, pero es un poco grosero usarlo en mi humilde opinión. La máquina virtual se terminará, no importa qué más se esté ejecutando.

Prefiero dispose() o simplemente cerrar (teniendo setDefaultCloseOperation(DISPOSE_ON_CLOSE)) cualquier ventana mostrada (JFrame, JDialog, ...). Si solo hay subprocesos daemon en ejecución, la máquina virtual finalizará. Si hay algún hilo no demonio en vivo, la JVM no terminará y el hilo puede finalizar su trabajo.
Al hacerlo, siempre puedo incluir (partes de) un programa en otro sin tener que preocuparme si uno de ellos termina accidentalmente el otro.

hay muy pocas situación en la que la JVM realmente necesitaba ser "muerto" ...

0

Hay reglas oscilación para el hilo EDT para finalizar con normalidad.

Lo más importante es asegurarse de que todos los marcos se hayan eliminado. Desafortunadamente, esto puede no ser tan sencillo si usa diálogos modales sin padres porque Swing creará un marco padre invisible para tales cuadros de diálogo.

En este caso, tiene que enumerar todos los marcos (puede usar Frame.getFrames() para eso) y explícitamente dispose() ellos.

Por supuesto, debe asegurarse de que no Thread está vivo (excepto los demonios). Algunas bibliotecas e incluso algunas API de JDK crean subprocesos no dependientes de daemon, que debe cerrar usted mismo.

Finalmente, y lo más importante, no llamar a System.exit() no funcionará en un entorno de Java Web Start (consulte this SO question para obtener más información).

Por lo tanto, en conclusión, mi consejo sería llamar realmente al System.exit() porque no siempre se sabe en qué entorno se lanzará su aplicación. Pero agregaría un punto importante a eso: asegúrese de tener un solo punto desde el cual se realiza la salida. Llamarlo desde cualquier hilo estará bien.

1

No hay absolutamente nada de malo en llamar a System.exit desde cualquier hilo que desee.Dejarlo salir "normalmente" no funciona en la práctica, porque descubrirá que la aplicación estará dando vueltas mientras el GC recolecta cosas, antes de que la aplicación se cierre. He escrito toneladas de aplicaciones de gui Swing, y no hay absolutamente nada de malo en llamarlo. Tampoco es "grosero". Es la forma de Java.

Cuestiones relacionadas