首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在循环中杀死不终止的进程。

在循环中杀死不终止的进程。
EN

Stack Overflow用户
提问于 2015-08-30 08:34:20
回答 2查看 82关注 0票数 1

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

代码语言:javascript
复制
imageOut = imageProcess(imageIn);

这是一个循环:

代码语言:javascript
复制
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,所以我已经发布了自己的答案,这适用于早期版本中的一个简单案例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-30 08:37:37

最好的选择是使用ProcessBuilder启动一个新进程。当这个进程超时时,您可以调用它的destroy(),并知道所有的资源都将被清理。(也许临时档案除外)

票数 3
EN

Stack Overflow用户

发布于 2015-08-30 11:18:12

@为Java1.8发布了一个答案。使用他的一般方法,我为<1.8创建了以下代码。我对此进行了测试,它可以工作(在我的Mac上):

代码语言:javascript
复制
    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();  
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32294727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档