我正在使用纯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()?
本质上,我想把它作为一个过滤器来运行:“拒绝所有需要30秒以上处理的图像”。
更新:跟随Peter,我正在探索ProcessBuilder。
他为Java >=1.8发布了一个简单的解决方案,我已经接受了。由于我目前使用的是Java1.7,所以我已经发布了自己的答案,这适用于早期版本中的一个简单案例。
发布于 2015-08-30 08:37:37
最好的选择是使用ProcessBuilder启动一个新进程。当这个进程超时时,您可以调用它的destroy(),并知道所有的资源都将被清理。(也许临时档案除外)
发布于 2015-08-30 11:18:12
@为Java1.8发布了一个答案。使用他的一般方法,我为<1.8创建了以下代码。我对此进行了测试,它可以工作(在我的Mac上):
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();
}https://stackoverflow.com/questions/32294727
复制相似问题