我正在使用第三方库来处理大量数据集。该过程偶尔会陷入无限循环(或被阻塞-
不知道为什么并且无法进入代码)。我想在设定的时间后消除这个问题,然后继续处理下一个案件。一个简单的例子是:
for (Object data : dataList) {
Object result = TheirLibrary.processData(data);
store(result);
}
processData通常最多需要1秒。我想设置一个计时器,该计时器在10秒后杀死processData()
编辑我将不胜感激代码片段(我没有在使用Thread的过程中练习过)。执行器方法看起来很有用,但我不太知道如何开始。同样,对于更常规的方法而言,伪代码对我来说太笼统了。
@Steven Schlansker-建议除非第三方应用程序预期中断,否则它将无法正常工作。再次详细和示例将不胜感激
编辑我的同事Sam Adams得到了我想要的精确解决方案,我将其作为答案附在后面。它比其他答案更详细,但是我将给他们两个投票。我将Sam标记为已批准答案
山姆·亚当斯给我发了以下答案,这是我接受的答案
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异常正在堆栈中传播),如果先前受这些监视器保护的任何对象处于不一致状态,则其他线程可以看到损坏的对象,从而可能导致以任意行为。”
我已经实现了第二个,它可以满足我目前的需求。
问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循
问题内容: 在Java中指定的时间限制后,有没有办法杀死子线程?编辑:此特定线程也可能在最坏的情况下被阻止(线程用于等待文件修改并在发生此事件之前被阻止),所以我不确定中断()是否会成功? 问题答案: 利用来执行,签出你可以指定超时的方法。例如 当然在这里实施。
你好,有人能解释一下为什么这会形成一个无限循环吗?谢谢!
问题内容: 如何java.lang.Thread用Java 杀死A ? 问题答案: 有关他们为何不赞成使用Sun的内容,请参见此主题。它详细介绍了为什么这是一种不好的方法,以及通常应该采取什么措施才能安全地停止线程。 他们建议的方式是使用共享变量作为标志,要求后台线程停止。然后可以由另一个请求线程终止的对象来设置此变量。
问题内容: 我想知道如何“杀死”已启动的过程。我知道Process API,但是不确定,是否可以使用它来杀死已经运行的进程,例如firefox.exe等。如果可以使用Process API,可以请您指向正确的方向?如果没有,还有哪些其他可用选项?谢谢。 问题答案: 如果你从Java应用程序中以从头开始处理(例如,通过调用或),那么你将对其具有有效的引用,并且可以在Process类中调用该方法以终止
问题内容: 我在一家开发公司工作,正在对Web应用程序进行重大的重新设计,该应用程序在每次单击后都会重新加载所有内容,以广泛使用Javascript,因此实际上感觉就像是一个真正的Web应用程序。功能之一是使用基于Web的Painter(我认为是Web上的MSPaint),我将其嵌入到“按需页面”中。绘制并上传图像后,Web应用程序将卸载该applet,然后继续显示文件上传到的目录。 这是麻烦开始