System.exit(0)后“javaw.exe”不会退出

时间:2012-06-09 11:38:52

标签: java multithreading jframe javaw

我正在编写这个Java程序,其中有一个JFrame和一个Thread。 一切都很顺利,除非我单击“X”按钮关闭程序,程序本身关闭(框架和资源被破坏),但“javaw.exe”进程不会结束。我必须一直手动终止它。

我当然尝试了setDefaultCloseOperation(JFrame。* EXIT_ON_CLOSE *),我甚至尝试过使用System.exit(0)的awt窗口监听器,但仍然没有成功。

有任何想法可以提供帮助吗?

这是我的代码。 [它需要在您的机器上安装JavaCV。]

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();
    }
}

3 个答案:

答案 0 :(得分:3)

记住这一点,

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.

尝试创建一个扩展JFrame的类,然后放置

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);在其构造函数中。

和是..在你的主要方法中,你可以看到框架,使用EventQueue ..

例如:

public static void main(String[] args){
   EventQueue.invokeLater(new Runnable(){

   public void run(){
         myframe.setVisible
        }
   });
 }

答案 1 :(得分:2)

  • 退出程序(使用System.exit()或JFrame.EXIT_ON_CLOSE)
  • 转到任务管理器并记下进程ID(pid)
  • 打开终端窗口并cd c:\<path>\java\bin(用Java安装替换<path>
  • 使用jstack <pid> | more。将<pid>替换为任务管理器的进程ID。

查看未标记为“守护程序”的线程。将至少有一个这样的线程挂起,并在堆栈跟踪中具有关闭处理程序。

答案 2 :(得分:2)

我想我找到了问题点。问题似乎出现在“grabber.start();”线。 (因为通过评论该行,一切都很顺利。这是openCV库显示出来的一个问题。所以我想解决这个问题并不容易。

感谢大家的努力。

编辑:[找到解决方案]

他们似乎有OpenCVFrameGrabber类实现了Thread Runnable接口,因此,此类创建的对象随后像线程一样运行。 (虽然不一样)。 所以无论如何,作为这个问题的解决方案,我确实首先释放了抓取器:

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);
        }
    });
}