java - 如何中断p.waitFor()?

标签 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”按钮,它所做的就是生成一个记事本进程。
一旦您关闭记事本,它就会生成另一个记事本。 我希望它能做到这一点

但是,没有办法阻止它停止。例如,按 Pane 上的 X 不会执行任何操作。

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

最佳答案

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

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

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

更好地解释一下你的偶发事件

关于java - 如何中断p.waitFor()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26516839/

相关文章:

java - Spring Boot 与 map 的宽松绑定(bind)是重复属性

java - executeQuery() - 返回结果集

c++ - 是否可以在不展开调用堆栈的情况下终止 Windows XP 上的 C++ 应用程序?

jquery addClass - 等待、延迟、速度、超时或其他

jQuery:WAITING多个 GET 请求成功处理

c - fork() 和 wait()/父/子更改的值

Java SWT : show paintings in tooltip

java - Android studio 组织导入,不会删除 Unresolved 导入

启动进程时 Java Android ping IOException "Too many files open"

C# Process.Start 参数被截断