Java 如何中断p.waitFor()?

Java 如何中断p.waitFor()?,java,process,wait,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() {

我有一个在.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执行的操作在EDT线程上运行:Java线程执行所有事件/事件处理程序。由于p.waitFor不会立即返回,它将阻止所有后续事件处理

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

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


更好地解释您的连续性

能否获取已启动的记事本实例的进程id,并定期查看它是否已关闭?我想如果你注意到这是否是为特定的操作系统设计的,这会对其他人有所帮助,因为也许你可以做一些特定于操作系统的技巧。我猜我的程序只是为Windows指定的,那么你想让你的程序既打开一个新的记事本,又在当前记事本关闭时不打开一个新的记事本?我很困惑。。。为什么不在go按钮旁边创建一个quit按钮呢?然后在另一个线程中执行waitFor。您可以添加另一个JButton退出该程序。问题是p.waitFor有效阻止Java程序启动另一个侦听器。