在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(!所有线程都完成了)”没有给出实际的方法