gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:27:29 31 4
gpt4 key购买 nike

我有一个在 .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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com