【发布时间】:2013-08-09 10:51:47
【问题描述】:
启动多个线程并让每个 exec() 然后destroy() 一个正在运行的 java 进程会导致某些进程没有被销毁并且在程序退出后仍在运行。这是一些重现该问题的代码。我注意到你启动的线程越多,存活的进程就越多。而且在destroy()之前睡眠越多,存活的进程就越少。 (我以 InfiniteLoop 为例。任何正在运行的进程都可以解决问题。)
编辑:已向 Oracle 报告错误,等待答复。随时分享有关该主题的任何知识/实验。
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();
}
【问题讨论】:
-
你有例外吗?
-
也不例外。
-
e.printStackTrace() 在 catch 块中的执行过程中什么都不做。
-
您是否在等待线程终止后再退出?你是从一个守护线程中生成它们(如果是这样,那么当你的程序退出时,JVM 可能会在它们的 sleep() 调用中终止它们)?
-
我将尝试重新创建它。我是否正确假设 InfiniteLoop 只是运行一个无限循环?
标签: java multithreading process destroy