Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中杀死无限循环_Java_Kill_Infinite Loop - Fatal编程技术网

在java中杀死无限循环

在java中杀死无限循环,java,kill,infinite-loop,Java,Kill,Infinite Loop,我正在使用第三方库来处理大量数据集。这个过程偶尔会进入无限循环(或者被阻塞——不知道为什么,也无法进入代码)。我想在一段时间后结束这个,然后继续下一个案例。一个简单的例子是: for (Object data : dataList) { Object result = TheirLibrary.processData(data); store(result); } processData通常最多需要1秒。我想设置一个计时器,在10秒后终止processData() 编辑 我希望

我正在使用第三方库来处理大量数据集。这个过程偶尔会进入无限循环(或者被阻塞——不知道为什么,也无法进入代码)。我想在一段时间后结束这个,然后继续下一个案例。一个简单的例子是:

for (Object data : dataList) {
    Object result = TheirLibrary.processData(data);
    store(result);
}
processData通常最多需要1秒。我想设置一个计时器,在10秒后终止processData()

编辑 我希望有一段代码片段(我不擅长使用线程)。Executor方法看起来很有用,但我不太知道如何开始。另外,对于更传统的方法来说,伪代码过于通用,我无法编写

@Steven Schlansker建议,除非第三方应用程序预期到中断,否则它将无法工作。请再次提供详细信息和示例

编辑
我从我的同事山姆·亚当斯那里得到了我想要的精确解决方案,我将其作为一个答案附在后面。它比其他答案更详细,但我会给他们两个投票。我会将Sam的标记为已批准的答案

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


编辑:Democode请求

这是伪代码,因此您必须对其进行改进和扩展。此外,检查呼叫是否成功也会有帮助

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);
    }
}
其中一个方法接受超时参数。创建一个调用库的可调用函数,并将其包装在列表中作为该方法的参数。返回的未来表明它是如何进行的


(注意:未经我测试)

山姆·亚当斯给了我以下答案,这是我接受的答案

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();
}
但这种方法已经被弃用,因为它是危险的

“此方法本质上是不安全的。使用thread.stop停止线程会导致它解锁所有已锁定的监视器(这是未经检查的ThreadDeath异常向堆栈上传播的自然结果)。如果以前受这些监视器保护的任何对象处于不一致的状态,则其他线程会看到损坏的对象,这可能会导致任意行为。”


我已经实现了第二个,它现在做了我想做的。

你打败了我-我删除了类似的答案,但我认为值得一提的是,通过使用join(超时),你将等待足够长的时间…考虑到这是我将要写的方法a+1。可能需要一些代码来解释它是如何工作的。但是使用java.util.concurrent绝对是一种方法。请随意编写一个更好的答案。如果库不能正确地处理中断,您可能永远也不会从无限循环返回:-(@Steven Schlansker处理此问题的唯一安全方法是启动一个单独的jvm并使用RMI调用该方法。这样,您就可以杀死另一个jvm。@Steven-每个Java程序员都应该学会安全处理中断的参数。它肯定是在无限循环中,还是会被阻止?分析关闭的库可能会有所帮助(除非它是模糊的)。@Jim Downing是的,它可能被阻止-不知道为什么可以在JMX中执行此操作?第二个解决方案(您说您已经实现)与添加到schoetbi回答中的解决方案和注释相同。@Jim Downing schoetbi的回答是伪代码,没有给出准确的调用(例如,“while(!所有线程都完成了)”没有给出实际的方法