在循环中杀死一个非终止进程
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();
}
我正在使用纯 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();
}