从一个线程开始杀死Java进程

时间:2010-11-09 14:35:18

标签: java multithreading process interrupt

我开发了一个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”也会完成执行。有人可以帮我解决这个问题吗?我错过了什么?

提前致谢

1 个答案:

答案 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包有工具可以使它成为一个单行,否则这是一个非常简单的方法来自己编写。