当前位置: 首页 > 知识库问答 >
问题:

如何终止java启动的进程

顾池暝
2023-03-14

我使用的是p=运行时。getRuntime()。exec(“myScript.sh”);作为按钮a的addActionListener(new ActionListener())的actionPerformed(ActionEvent evt)的一部分。

我想有一个方法来终止进程。我试图创建另一个按钮(按钮B)来调用p.destroy()。但是,看起来在单击按钮A后,它启动了进程,并且只有在进程完成之前,我才能单击GUI上的其他按钮(包括右上角的关闭按钮)。所以我不能在中间终止进程。

有什么方法可以终止进程吗?或者有什么方法可以在按钮A启动的进程仍在运行时单击其他按钮?

我注释掉了p.waitFor();单击btnRun后仍然无法单击其他按钮

    private Process p;
    btnRun.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            String s;
            try {
                p = Runtime.getRuntime().exec(command);
                BufferedReader br = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));
                while ((s = br.readLine()) != null)
                    System.out.println(s);
                //p.waitFor();
                //System.out.println ("exit: " + p.exitValue());
                //p.destroy();
            } catch (Exception e) {}
        }
     });

    btnTerminate.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            p.destroy();
        }
    });

共有1个答案

蒋烨然
2023-03-14

来自BufferedReader的while循环处理线也会阻塞EDT。BufferedReader将尝试读取流,直到它被关闭,并且在进程完成时将被关闭。在此之前,EDT被读线()阻塞。您必须在另一个线程中处理这些行。

请参见此示例

class InStreamPrinter extends Thread {
    InputStream is;

    InStreamPrinter(InputStream is) {
        this.is = is;
    }

    @Override
    public void run() {
        try (InputStreamReader isr = new InputStreamReader(is); 
            BufferedReader br = new BufferedReader(isr);) {
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后只需将输入流从Process传递给此Thread并启动它。

...
p = Runtime.getRuntime().exec(command);
new InStreamPrinter(p.getInputStream()).start();
...
 类似资料:
  • 问题内容: 我正在使用以下命令启动子流程: 但是,当我尝试杀死使用: 要么 该命令一直在后台运行,所以我想知道如何才能真正终止该过程。 请注意,当我使用以下命令运行命令时: 发出时,它确实成功终止。 问题答案: 使用进程组,以便能够向组中的所有进程发送信号。为此,您应该将会话ID附加到生成的子进程的父进程中,在您的情况下这是一个外壳程序。这将使其成为流程的组长。因此,现在,当信号发送到流程组负责人

  • 问题内容: 我正在使用以下命令启动子流程: 但是,当我尝试杀死使用: 要么 该命令一直在后台运行,所以我想知道如何才能真正终止该过程。 请注意,当我使用以下命令运行命令时: 发出时,它确实成功终止。 问题答案: 使用进程组,以便能够向组中的所有进程发送信号。为此,你应该将会话ID附加到派生/子进程的父进程中,在你的情况下,这是一个外壳程序。这将使其成为流程的小组负责人。因此,现在,当信号发送到流程

  • 问题内容: 当从cmd行执行某些命令(比如说“ x”)时,我收到以下消息:“ …按任意键继续…。”。因此,它等待用户输入解除阻止。 但是当我从Java执行相同的命令(’x’)时: 代码块… 我试图在进程的输出流中写入一些内容,但是我该怎么做,以确保代码从未到达该行? 问题答案: 我认为(虽然不能确定)您是在谈论Windows而不是Unix? 如果是这样,则命令行进程实际上可能不是在等待按键(或输入

  • 我有一个应用Gradle插件的项目。我的问题是,即使底层进程终止,它也不会终止:如果我运行这个: 带有仅包含系统的主系统。退出(0) 程序终止,但Gradle没有终止。当底层Java程序终止时,如何强制Gradle进程终止? 编辑:我知道我可以调用gradle——stop,但这需要另一个进程,这不是一个选项。

  • 我正在使用2.2.3 我使用创建了一个非常简单的项目。 当我运行项目时,在选项卡中出现以下错误: 那么该怎么做才能防止这种过程杀熟呢?

  • PHP程序的启动可以看作有两个概念上的启动,终止也有两个概念上的终止。 其中一个是PHP作为Apache(拿它举例,板砖勿扔)的一个模块的启动与终止, 这次启动php会初始化一些必要数据,比如与宿主Apache有关的,并且这些数据是常驻内存的! 终止与之相对。 还有一个概念上的启动就是当Apache分配一个页面请求过来的时候,PHP会有一次启动与终止,这也是我们最常讨论的一种。 现在我们主要来看一