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

2022-09-03 02:16:26

启动多个线程并让每个 exec() 然后销毁() 一个正在运行的 java 进程会导致某些进程未被销毁,并且在程序退出后仍在运行。下面是一些重现此问题的代码。我注意到您启动的线程越多,保持活动状态的进程就越多。在 destroy() 之前,睡眠时间越长,保持活动状态的进程就越少。(我以InfiniteLoop为例。任何正在运行的进程都可以做到这一点。

编辑:错误已报告给甲骨文,等待答案。随意分享有关该主题的任何知识/实验。

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();
}

答案 1

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

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


答案 2

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

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

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

整篇文章值得一读,如果你需要使用 Runtime.exec()。