gpt4 book ai didi

Java: ExecutorService with Callables: Timeout: future.get() 导致直接中断程序

转载 作者:行者123 更新时间:2023-12-03 20:19:23 26 4
gpt4 key购买 nike

我在 Java 中使用 ExecutorService,我注意到一个我不理解的行为。我使用 Callable,当我调用我的线程(实现 Callable 的类)时,我设置了一个超时。然后我用 future.get() 等待结果,然后我想用 future.isDone() 检查执行任务期间是否发生超时。

正如我在有关带超时的 invokeAll 的文档中所读到的:返回代表任务的 Future 列表,其顺序与迭代器为给定任务列表生成的顺序相同。如果操作没有超时,则每个任务都已完成。如果确实超时,其中一些任务将不会完成。

所以我想我会在这两种情况下得到一个 Future 结果列表,如果超时发生,如果没有发生。

现在发生的是以下情况:发生超时时,代码不会在 future.get() 之后继续,而且我永远无法检查是否发生超时使用 future.isDone()。我没有捕捉到任何异常,我直接导致我代码中的 finally block ,我真的不明白。

这是我的代码片段:

     try {
// start all Threads
results = pool.invokeAll(threads, 3, TimeUnit.SECONDS);

for (Future<String> future : results)
{
try
{
// this method blocks until it receives the result, unless there is a
// timeout set.
final String rs = future.get();

if (future.isDone())
{
// if future.isDone() = true, a timeout did not occur.
// do something
}
else
{
// timeout
// log it and do something
break;
}
}
catch (ExecutionException e)
{
// log messages and break, this is a snippet!
}
catch (InterruptedException ex)
{
// log message and break, this is a snippet!
}
}

}
catch (InterruptedException ex)
{
// log message, this is a snippet!
}
finally
{
// when a timeout occurs, the code jumps from future.get() directly to this point!
}

有人可以解释一下,为什么我无法访问 future.isDone() 以及我应该更改哪些内容才能识别超时?

谢谢!

最佳答案

您没有捕捉到 CancellationException,这很可能是在调用 get 之后抛出的。请注意,此异常扩展了 RuntimeException,编译器不会警告您捕获它。

阅读 invokeAll 的文档:

Executes the given tasks, returning a list of Futures holding their status and results when all complete or the timeout expires, whichever happens first. Future.isDone() is true for each element of the returned list. Upon return, tasks that have not completed are cancelled.

关于Java: ExecutorService with Callables: Timeout: future.get() 导致直接中断程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com