【问题标题】:Kill Process in Java programmatically以编程方式杀死Java中的进程
【发布时间】:2019-01-16 10:24:27
【问题描述】:

我有一个 Swing 应用程序,它通过文本框获取输入,当点击开始按钮时,我们启动一个 Ant 脚本 - 以编程方式(org.apache.tools.ant.Project、org.apache.tools.ant. ProjectHelper)(ant 文件属性来自输入文本框)。这个 Ant 脚本将开始从 CVS 中检出代码。

现在,我想在用户点击停止按钮时停止执行此 Ant 脚本。

问题: 一旦用户填写文本框并点击开始,我就开始执行 Ant 脚本。因此,控件从该 Applet 或输入页面移动到后端 java 代码。所以我无法访问主小程序中的“停止”按钮。

【问题讨论】:

  • 我同意约翰的观点,你可能想使用某种线程。如果我是你,我会添加“Ant”和“MultiThreading”标签。
  • 由于您没有要求终止外部进程 [也不是当前进程],因此我编辑了标签以反映您遇到的问题。

标签: java multithreading ant


【解决方案1】:

我不能确定,但​​听起来你想要做的是使用线程来执行后端 Java 代码,然后告诉该线程在用户点击停止时终止。

【讨论】:

  • Ant 本身可以运行多个线程。所以杀死原来的人可能实际上并没有帮助。但我不确定。
  • 我很抱歉,但我的印象是,由于执行 Ant 的代码等待 Ant 退出,您的 GUI 正在冻结。如果是这种情况,您需要在单独的线程中执行 Ant。
  • 没什么可道歉的。只是讨论这个想法。实际上,如果 ant 作为同一进程的一部分运行,那可能会正常工作。
  • 是的 - 只需在不同的线程中运行代码,并在用户点击停止时将停止的决定传达给该线程并让线程优雅地退出[例如,通过在 ant 上调用某种取消(如果可用)]。
【解决方案2】:
public class Kill 
{
    public static void main(String[] args) throws Exception 
    {
        ProcessBuilder p = new ProcessBuilder("notepad.exe","fake.xml");
        p.directory(new File("c:/temp/"));

        System.out.println("Starting ...");
        Process x = p.start();
        System.out.println("Started ...");
        System.out.println("Sleeping ...");
        Thread.sleep(3000);     
        System.out.println("Woke up ...");
        System.out.println("Destroying...");

        x.destroy();
        x.waitFor(); // If you don't wait for it then the application will be terminated as soon as it is started

        System.out.println("Return value = " + x.exitValue());
        System.out.println("Over ...");
    }
}

一种方法是使用x.waitFor(); 方法并继续等待用户操作来杀死蚂蚁进程,或者它可能会自行完成。无论如何,您将需要x.destroy(); 并使用x.exitValue() 检查成功和失败。但是在工作线程中使用它更有意义,因为 UI 将保持响应。

【讨论】:

  • 当用户点击停止按钮时,他可能不得不以某种方式打断waitFor
  • @Vlad:是的。当使用工作线程模型时,他必须等待用户操作或进程完成,即正如你所说的那样。但是即使在工作线程中终止进程,用户也可以在调用destroy之后waitFor(x millisecs)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
相关资源
最近更新 更多