在循环中杀死一个非终止进程

killing a non-terminating process in a loop

我正在使用纯 java "blackBox" 处理图像,可表示为:

imageOut = imageProcess(imageIn);

这是一个循环:

for (int i = 0; i < 1000; i++) {
    imageOut[i] = imageProcess(imageIn[i]);
}

几乎所有进程都在 2-5 秒内终止,但少数(可能是 2%)运行 持续了很多分钟,有些似乎没有终止(我不知道为什么)。我想在(比如)30 秒后终止这些,记录病理图像,然后转到下一个。 blackBox没有i/o,也没有办法嵌入Thread.isInterrupted(),等等

我可以在 30 秒后使用 Thread.stop() 终止进程吗?如果是这样,我该怎么做? [我意识到它已被弃用,但我找不到其他方法。] 或者有没有更好的方法来解决这个问题,而不需要修改 imageProcess()?

本质上我想运行这个作为过滤器:"Reject all images that take longer than 30seconds processing"。

更新: 跟随 Peter Lawrey,我正在探索 ProcessBuilder

他为 Java >=1.8 发布了一个简单的解决方案,我已经接受了。由于我目前使用的是 Java 1.7,因此我发布了自己的答案,该答案适用于早期版本中的一个简单案例。

最好的选择是使用 ProcessBuilder 启动一个新进程。当此进程超时时,您可以对其调用 destroy() 并知道所有资源都将被清理。 (临时文件除外)

@Peter Lawrey 发布了 Java 1.8 的答案。使用他的一般方法,我为 <1.8 创建了以下代码。我已经测试过这个并且它有效(在我的 Mac OSX 上):

    public void testProcess() throws IOException, InterruptedException {
    // create a process which runs for a second
    ProcessBuilder processBuilder = new ProcessBuilder("sleep", "1");
    Process process = processBuilder.start();
    for (int i = 0; i < 3000; i++) {
        // test it every 100 milliseconds
        Thread.sleep(100); // 100 millisec
        int exitValue = -1;
        try {
            exitValue = process.exitValue();
        } catch (IllegalThreadStateException e) {
            // this is thrown if the process has not yet terminated
            System.out.println("step: "+i);
            continue;
        }
        // process has exited
        if (exitValue == 0) {
            System.out.println("final steps: "+i);
            break;
        }
    }
    // destroy() process in all cases
    process.destroy();  
}