我开发了一个JSP Web应用程序,在每次请求时都会生成一个新的Java Thread。在每个新生成的线程中,我使用Runtime.exec()创建一个Process,并将进程对象存储在线程中的实例变量中。我有一个要求,我必须杀死创建的子进程,并停止线程。所以,我在线程和overridden方法中覆盖了中断方法,我在实例变量中已经存储过的Process对象上调用了destroy()。以下是代码:
public class MyThread extends Thread {
private Process subprocess;
@Override
public void run() {
subprocess = Runtime.getRuntime().exec("myprocess.exe");
subprocess.waitFor();
/*
Some more statements
*/
}
@Override
public void interrupt() {
if(subprocess!=null) {
System.out.println("Destroying Process");
subprocess.destroy();
}
super.interrupt();
}
}
覆盖中断方法是非法的吗? 重要的是我在中断创建它的线程之前杀死创建的进程。我发现线程确实被中断了,因为waitFor()之后的语句没有被执行。但是,destroy()不起作用(但被调用),即使我在完成之前调用了interrupt()方法,创建的“myprocess.exe”也会完成执行。有人可以帮我解决这个问题吗?我错过了什么?
提前致谢
答案 0 :(得分:5)
覆盖interrupt
并不违法,但我不推荐它。也许更简洁的方法是:
public class MyThread extends Thread {
private Process subprocess;
@Override
public void run() {
subprocess = Runtime.getRuntime().exec("myprocess.exe");
try {
subprocess.waitFor();
}
catch (InterruptedException e) {
subprocess.destroy();
}
/*
Some more statements
*/
}
}
不要忘记您还应该从子进程输出/错误流中提取数据,否则可能会使用完整缓冲区和阻塞的子进程。从这些流中读取并丢弃数据是可以的。我怀疑commons-io
包有工具可以使它成为一个单行,否则这是一个非常简单的方法来自己编写。