【问题标题】:why all Future.get() throwing CancelleationException in invokeAll with timeout为什么所有 Future.get() 在 invokeAll 中抛出 CancelleationException 并超时
【发布时间】:2013-09-19 13:13:55
【问题描述】:

我创建了一个可调用的对象,它打印几行并休眠 2 秒。我创建了一个 main 方法,它创建了 10 个可调用的实例并传递给 ExecutorService 的 invokeALL 方法。

 service.invokeAll(callableList, 3, SECONDS);

当我迭代返回的未来对象列表时。我收到 CancellationException。

我正在测试所有 future.get() 调用是否会导致 CancellationException 或者只有那些无法完成并被取消的任务。

无论invokeALL中的时间设置如何,我都会得到所有结果或所有CancellationExceptions

当我调用 future.get() 时,我真的期待至少有一些任务会完成并返回结果。

【问题讨论】:

    标签: java multithreading executorservice


    【解决方案1】:

    简答。

    所有任务都没有在 3 秒内完成。

    长答案。

    TPE 将运行所有任务并等待它们完成。它将在每个未来执行 get,并以 3 秒作为 get 方法的等待时间。如果所有任务在 3 秒内完成,则 Futures 列表将不受影响返回。

    如果未在预期时间内完成,则取消未完成的期货。因此,如果您有 5 个任务并且前 2 个已完成但第 3 次超时,则 3、4 和 5 将被取消。

    文档中略有说明

    返回: 代表任务的 Future 列表,其顺序与给定任务列表的迭代器生成的顺序相同。如果 操作没有超时,每个任务都会完成。如果确实如此 超时,其中一些任务将无法完成。

    返回时,取消未完成的任务。

    【讨论】:

    • 但重点是我正在取消或完成所有任务。要么全有,要么全无。
    • 这可能意味着第一次未能在 3 秒内完成。 TPE 将通过cancel 每个 Future 运行。如果 Future 完成,则取消是 noop。
    • 你确定所有个任务都被取消了吗?如果只有一个被取消,则会抛出 CancellationException(假设您正在迭代每个并geting 他们)
    • 是的。我确信,因为我正在为每个任务获得取消异常或获得所有任务的结果。所以,它让我得出结论,要么全有,要么全无。而文档似乎表明很少有任务会成功。
    • 你能写一个小测试用例来演示你所看到的全有或全无属性吗?能否说明您使用的 JDK 版本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2016-03-04
    • 2016-11-20
    • 2011-02-14
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多