Java 终止循环中的非终止进程

Java 终止循环中的非终止进程,java,java-threads,Java,Java Threads,我使用纯java“blackBox”处理图像,可通过以下方式表示: imageOut = imageProcess(imageIn); 这是一个循环: for (int i = 0; i < 1000; i++) { imageOut[i] = imageProcess(imageIn[i]); } for(int i=0;i=1.8的简单解决方案,我已经接受了。由于我目前使用的是Java 1.7,因此我发布了自己的答案,该答案适用于早期版本中的一个简单案例。最好的选择是使用P

我使用纯java“blackBox”处理图像,可通过以下方式表示:

imageOut = imageProcess(imageIn);
这是一个循环:

for (int i = 0; i < 1000; i++) {
    imageOut[i] = imageProcess(imageIn[i]);
}
for(int i=0;i<1000;i++){
imageOut[i]=imageProcess(imageIn[i]);
}
几乎所有进程都会在2-5秒内终止,但有一些进程(可能是2%)会运行数分钟,有些进程似乎不会终止(我不知道为什么)。我想在(比如)30秒后终止这些,记录病理图像,然后转到下一个。黑盒没有i/o,但也无法嵌入
线程。isInterrupted()

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

本质上,我希望将其作为一个过滤器运行:“拒绝所有处理时间超过30秒的图像”

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


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

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

@Peter Lawrey已经发布了一个Java 1.8的答案。使用他的一般方法,我创建了以下代码,只是为了检查。。。我需要创建一条命令行,通过
main()
调用每个进程,并通过参数传递数据?@peter.murray.rust Correct。这有点痛苦,但会让你完全孤立。我已经准备好了几乎所有的东西——命令行解释器等等,所以这不是问题。我在哪里设置计时器?我在
ProcessBuilder
中看不到任何内容。谢谢,这看起来很有用,但我在中找不到带参数的
waitFor()
。如果比Java7晚,我会试试你的。接受你的答案。我还将发布我自己的hack for Java,我已经在生产运行中对此进行了测试,并且很高兴地说它在一个大循环中工作(数百个图像没有明显的问题。请注意,由于我的应用程序实际上是主程序的命令行,因此每次迭代都会加载程序。由于实例之间的间隔大于4秒,这可能不是问题,但机器似乎工作得非常努力。
    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();  
}