Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"javaw.exe" won't exit after System.exit(0)

I'm writing this Java program in which I have a JFrame and a Thread. Everything goes fine, except when I click the 'X' button to close the program, the program itself closes (frame and it's resources get destroyed), but the "javaw.exe" process won't end. I have to terminate that manually all the time.

I tried of course setDefaultCloseOperation(JFrame.*EXIT_ON_CLOSE*) , I even tried awt window listener with System.exit(0) in it, but still no success.

Any ideas to help?

This is the my code. [It needs JavaCV to be installed on your machine.]

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();
    }
}
like image 908
Emil Avatar asked Feb 21 '23 05:02

Emil


1 Answers

  • Exit your program (using System.exit() or JFrame.EXIT_ON_CLOSE)
  • Go to the taskmanager and note the process id (pid)
  • Open a terminal window and cd c:\<path>\java\bin (replace <path> with your Java installation)
  • Use jstack <pid> | more. Replace <pid> with the process id from task manager.

Look at the threads that are not flagged as "daemon". There will be at least one such thread which hangs and has the shutdown handler in the stack trace.

like image 149
Hendrik Brummermann Avatar answered Feb 23 '23 00:02

Hendrik Brummermann