杀死java中的无限循环

时间:2010-08-15 22:04:17

标签: java kill infinite-loop

我正在使用第三方库来处理大量数据集。这个过程偶尔会进入一个无限循环(或被阻止 - 不知道为什么也不能进入代码)。我想在一段时间之后杀死它并继续下一个案例。一个简单的例子是:

for (Object data : dataList) {
    Object result = TheirLibrary.processData(data);
    store(result);
}

processData通常最多需要1秒钟。我想设置一个计时器,在10秒后杀死processData()

EDIT 我会很感激代码片段(我没有使用过Threads)。 Executor方法看起来很有用但我不太清楚如何开始。此外,更常规方法的伪代码对我来说太笼统了。

@Steven Schlansker - 建议除非第三方应用程序预期中断,否则它将无效。再次详细和例子将不胜感激

EDIT 我从同事Sam Adams那里得到了我想要的精确解决方案,我将其作为答案。它比其他答案更详细,但我会给他们两个投票。我将Sam的标记为已批准的答案

3 个答案:

答案 0 :(得分:10)

其中一个ExecutorService.invokeAll(...)方法采用超时参数。创建一个调用库的Callable,并将其作为该方法的参数包装在List中。返回的未来表明它是如何发展的。

(注意:我未经测试)

答案 1 :(得分:7)

在另一个线程中调用库,并在超时后终止该线程。这样,如果它们不相互依赖,您也可以同时处理多个对象。


编辑:民主代码请求

这是伪代码,因此您必须改进和扩展它。此外,错误检查天气呼叫成功与否也会有所帮助。

for (Object data : dataList) {
    Thread t = new LibThread(data);
    // store the thread somewhere with an id
    // tid and starting time tstart 
    // threads
    t.start();
    }

while(!all threads finished)
{
    for (Thread t : threads)
    {
        // get start time of thread
        // and check the timeout
        if (runtime > timeout)
        {
            t.stop();
        }
    }
}

class LibThread extends Thread {
    Object data;

    public TextThread(Object data) 
    {
        this.data = data;
    }

    public void processData() 
    {
        Object result = TheirLibrary.processData(data);
        store(result);
    }
}

答案 2 :(得分:2)

Sam Adams向我发送了以下答案,这是我接受的答案

Thread thread = new Thread(myRunnableCode);
thread.start();
thread.join(timeoutMs);
if (thread.isAlive()) {
  thread.interrupt();
}

myRunnableCode会定期检查Thread.isInterrupted(),如果返回true,则会彻底退出。

或者你可以这样做:

Thread thread = new Thread(myRunnableCode);
thread.start();
thread.join(timeoutMs);
if (thread.isAlive()) {
  thread.stop();
}

但是这种方法已被弃用,因为它是危险的。

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#stop() “这种方法本质上是不安全的。使用Thread.stop停止一个线程会导致它解锁它锁定的所有监视器(这是未经检查的ThreadDeath异常向上传播的自然结果)。如果以前受到任何保护的对象这些监视器处于不一致状态,受损对象对其他线程可见,可能导致任意行为。“

我实现了第二个,它实现了我想要的目标。