pet*_*ust 5 java kill infinite-loop
我正在使用第三方库来处理大量数据集.这个过程偶尔会进入一个无限循环(或被阻止 - 不知道为什么也不能进入代码).我想在一段时间之后杀死它并继续下一个案例.一个简单的例子是:
for (Object data : dataList) {
Object result = TheirLibrary.processData(data);
store(result);
}
Run Code Online (Sandbox Code Playgroud)
processData通常最多需要1秒钟.我想设置一个计时器,在10秒之后杀死processData()
编辑我会很感激代码片段(我没有使用线程).Executor方法看起来很有用但我不太清楚如何开始.此外,更常规方法的伪代码对我来说太笼统了.
@Steven Schlansker - 建议除非第三方应用程序预期中断,否则它将无效.再次详述和示例将被理解
编辑我从同事Sam Adams那里得到了我想要的精确解决方案,我将其作为答案.它比其他答案更详细,但我会给他们两个投票.我将Sam的标记为已批准的答案
Tho*_*sen 10
其中一个ExecutorService.invokeAll(...)方法需要一个超时参数.创建一个调用库的Callable,并将其作为该方法的参数包装在List中.返回的未来表明它是如何进行的.
(注意:我未经测试)
将调用放在另一个线程中的库中,并在超时后终止该线程.这样,如果它们不相互依赖,您也可以同时处理多个对象.
编辑:民主代码请求
这是伪代码,因此您必须改进和扩展它.错误检查天气呼叫成功与否也会有所帮助.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
萨姆·亚当斯给我发了以下答案,这是我接受的答案
Thread thread = new Thread(myRunnableCode);
thread.start();
thread.join(timeoutMs);
if (thread.isAlive()) {
thread.interrupt();
}
Run Code Online (Sandbox Code Playgroud)
并myRunnableCode定期检查Thread.isInterrupted(),如果返回 true 则干净地退出。
或者你可以这样做:
Thread thread = new Thread(myRunnableCode);
thread.start();
thread.join(timeoutMs);
if (thread.isAlive()) {
thread.stop();
}
Run Code Online (Sandbox Code Playgroud)
但这种方法已被弃用,因为它很危险。
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#stop() “这种方法本质上是不安全的。使用 Thread.stop 停止线程会导致它解锁所有线程它已锁定的监视器的数量(作为未经检查的 ThreadDeath 异常在堆栈中传播的自然结果)。如果先前受这些监视器保护的任何对象处于不一致的状态,则损坏的对象对其他线程可见,从而可能导致任意行为。”
我已经实现了第二个,它达到了我目前想要的效果。
| 归档时间: |
|
| 查看次数: |
3978 次 |
| 最近记录: |