线程启动的运行进程不会破坏(Java)

Bas*_*ien 13 java multithreading process destroy

启动多个线程并使每个exec()然后destroy()一个正在运行的java进程导致某些进程没有被销毁并且在程序退出后仍然运行.这是一些重现问题的代码.我注意到你启动的线程越多,进程就越多.而且,在destroy()之前睡眠越多,进程就越少.(我使用InfiniteLoop作为示例.任何正在运行的进程都可以解决问题.)

编辑:已经向Oracle报告了Bug,等待答案.随意分享有关该主题的任何知识/实验.

for(int i = 0; i < 100; i++)
{
  new Thread(new Runnable()
  {
    public void run()
    {
      try
      {
        Process p = Runtime.getRuntime().exec(new String[]{"java", "InfiniteLoop"});
        Thread.sleep(1);
        p.destroy();
      }catch(IOException | InterruptedException e){e.printStackTrace();}                    
    }
  }).start();
}
Run Code Online (Sandbox Code Playgroud)

Abh*_*hek 6

使用p.waitFor();之前p.destroy();

这将确保完成先前的过程。我认为你 p.destroy 命令比exec()命令执行操作更早被调用。因此它变得毫无用处。

  • `p.waitFor()` 等待进程终止,因此在 `InfiniteLoop` 的情况下,它永远不会返回。`exec()` 点——我想知道;我在文档中找不到任何内容来保证当 `exec()` 返回时进程实际上已经启动,尽管我认为这是因为它有能力例如在找不到命令时抛出错误。 (4认同)

小智 5

如果子进程向 stdout 或 stderr 写入任何内容(有意或无意),则可能会导致问题:

由于某些原生平台只为标准输入输出流提供有限的缓冲区大小,因此未能及时写入子进程的输入流或读取子进程的输出流可能会导致子进程阻塞,甚至死锁。

来源:http ://www.javaworld.com/jw-12-2000/jw-1229-traps.html

如果您需要使用 Runtime.exec(),整篇文章在我看来值得一读。


小智 1

我相信根据link,操作系统会生成一个不同的进程来响应此调用。该进程的生命周期独立于 Java 程序和其中的线程,因此您希望它在程序退出后继续运行。我刚刚在我的机器上尝试过,它似乎按预期工作:

import java.io.*;

class Mp {
public static void main(String []args) {
    for(int i = 0; i < 100; i++) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("1");
                    Process p = Runtime.getRuntime().exec
                        (new String[]{"notepad", ""});
                    System.out.println("2");
                    Thread.sleep(5);
                    System.out.println("3");
                    p.destroy();
                    System.out.println("4");
                }
                catch(IOException | InterruptedException e) {
                    e.printStackTrace();
                }                    
            }
        }).start();
    }
}
}
Run Code Online (Sandbox Code Playgroud)