如何中断p.waitFor()?

时间:2014-10-22 20:48:44

标签: java process wait

我有一个用.jar编译的Java程序,所以最终用户实际上不能只是在控制台中按ctrl + c。

他们必须在任务管理器中结束java进程 但是,有一种更简单的方法,不存在吗?

public class Test extends JFrame {
    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test frame = new Test();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Test() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);

        JButton go = new JButton("Go");
        go.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Process p;
                Runtime r = Runtime.getRuntime();
                while(true) {
                    try {
                        p = r.exec("notepad.exe");
                        p.waitFor();
                    } catch (IOException | InterruptedException e1) {
                        e1.printStackTrace();
                    }

                }
            }
        });
        contentPane.add(go);
    }
}

正如你所看到的,一旦你按下Go按钮,它就会产生一个记事本过程 一旦你关闭记事本,就会产生另一个记事本。 我希望它能够做到这一点

然而,没有办法阻止它停止。例如,按下窗格上的X不会执行任何操作。

如何使X有效地关闭Java程序,同时保留上述所有意外情况?

1 个答案:

答案 0 :(得分:0)

1)执行的操作在EDT线程上运行:java线程执行所有事件/事件处理程序。由于p.waitFor没有立即返回,它将阻止所有进一步的事件处理

2)永远不应该在edt线程上运行长时间运行的操作。在这种情况下,我建议spwan一个新线程,它将启动notepad.exe并在另一个线程中等待它...

3)另一点是:为什么要等notepad.exe退出?这里有一些微妙的不一致,从一个角度来看,你希望应用程序继续正常处理(点击x框应该退出应用程序),另一方面你希望你的应用程序不要继续正常处理,因为你希望等待记事本退出...

更好地解释您的诉讼