entre ejemplos diferencia java multithreading jframe javaw

diferencia - system.exit java ejemplos



"Javaw.exe" no se cerrará después de System.exit(0) (3)

Creo que encontré el punto problemático El problema parece aparecer en "grabber.start ();" línea. (Debido a que al comentar esa línea, todo salió bien. Es un problema que muestra la biblioteca de openCV. Así que supongo que no será tan fácil deshacerse de este problema.

Gracias a todos por el esfuerzo.

Editado: [ENCONTRÉ LA SOLUCIÓN]

Parece que tienen la clase OpenCVFrameGrabber implementada la interfaz Thread Runnable, por lo tanto, el objeto creado por esta clase posteriormente se ejecuta como un hilo. (No es lo mismo) Entonces, de todos modos, como una solución a este problema, primero lancé el capturador:

public Test() { //canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); canvas.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("/nClosing it."); try { //if (grabber != null) grabber.release(); //grabber.stop(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.exit(0); } }); }

Estoy escribiendo este programa Java en el que tengo un JFrame y un Thread. Todo va bien, excepto cuando hago clic en el botón ''X'' para cerrar el programa, el programa se cierra (el marco y sus recursos se destruyen), pero el proceso "javaw.exe" no termina. Tengo que terminar eso manualmente todo el tiempo.

Intenté por supuesto setDefaultCloseOperation (JFrame. * EXIT_ON_CLOSE *), incluso intenté con awt window listener con System.exit (0) en él, pero todavía no tuve éxito.

¿Alguna idea para ayudar?

Este es mi código [Necesita JavaCV para instalarse en su máquina]

class MyGrabber implements Runnable { final int INTERVAL = 1000;// /you may use interval IplImage image; CanvasFrame frame = new CanvasFrame("Web Cam"); public MyGrabber() { frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); } @Override public void run() { FrameGrabber grabber = new OpenCVFrameGrabber(0); // 1 for next camera int i = 0; try { grabber.start(); while (true) { image = grabber.grab(); if (image != null) { cvSaveImage("test.jpg", image); // show image on window frame.showImage(image); } Thread.sleep(INTERVAL); } } catch (InterruptedException e) { e.printStackTrace(); } catch (com.googlecode.javacv.FrameGrabber.Exception e) { e.printStackTrace(); } } } public class TestGrabber { public static void main(String[] args) { MyGrabber gs = new MyGrabber(); Thread th = new Thread(gs); th.start(); } }


Recuerda esto,

The JVM will terminate only and only when All the Non-Daemon threads including the main thread has terminated. You can try System.exit(0) on the main thread, which runs the main method.

Intenta crear una clase que amplíe JFrame , y luego coloca

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); en su constructor

y sí ... en su método principal donde hace que su marco sea visible, use la EventQueue ...

P.ej:

public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){ public void run(){ myframe.setVisible } }); }


  • Salga de su programa (usando System.exit () o JFrame.EXIT_ON_CLOSE)
  • Diríjase al administrador de tareas y observe la identificación del proceso (pid)
  • Abra una ventana de terminal y cd c:/<path>/java/bin (reemplace <path> con su instalación de Java)
  • Use jstack <pid> | more jstack <pid> | more . Reemplace <pid> con la identificación del proceso del administrador de tareas.

Mire los hilos que no están marcados como "daemon". Habrá al menos un hilo de este tipo que se cuelga y tiene el controlador de apagado en el seguimiento de la pila.