gpt4 book ai didi

java - FutureTask.get的CancellationException异常后访问Callable

转载 作者:行者123 更新时间:2023-12-01 11:36:33 26 4
gpt4 key购买 nike

在 FutureTask.get 的 CancellationException 异常之后访问底层 Callable 的首选方法是什么?

我有以下代码-

public class Ping implements Callable
{
public Ping(String serverName)
{
// stuff
}

// call() method, etc.
}

// other code

futures = executor.invokeAll(callables, TIMEOUT_SECONDS, TimeUnit.SECONDS);

for (Future<Object> future : futures)
{
try
{
PingStatus status = (PingStatus)future.get();
// do stuff
}
catch (CancellationException e)
{
// HELP: throw new RuntimeException("Could not ping " + callable.serverName);
}
}

如果达到超时,并且在获取时抛出 CancellationException,我想抛出一个新的异常,其中包含传递到 Callable 中的 serverName。这里最好的模式是什么?而且,为什么 FutureTask 不提供对构造函数中传递的底层 Callable 的引用?

最佳答案

由于任务和结果之间的分离,原始 Callable 无法从 Future 对象中检索。有很多方法都会导致 Future返回的对象不涉及 Callable 对象的使用或创建。以方法 submit(Runnable task) 为例它需要一个可运行的文件来代替。

Runnable 和 Callable 不共享共同的父父类(super class),这意味着如果 future 的对象要让您能够检索它,它必须返回 Object 类型的对象。 。这实在是太丑陋了。

幸运的是,如果您已阅读 invokeAll() 中返回列表的文档(强调我的):

a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list.

表示Callable的输入集合的顺序到返回的列表Future被保留。这样,您就可以使用Future的当前索引。找出哪个 Callable 被取消。

例如:

futures = executor.invokeAll(callables, TIMEOUT_SECONDS, TimeUnit.SECONDS);

int index = 0; // Index used for for-loop

for (Future<Object> future : futures){
try{
PingStatus status = (PingStatus)future.get();
// do stuff
}catch(CancellationException e){
Callable<Object> offendingCallable = callables.get(index);

// deal with object here
}

index++;
}

作为旁注,您似乎正在返回一个对象 PingStatus作为执行的结果。因此,您应该将自定义可调用声明为:

public class Ping<PingStatus> implements Callable{

以及您适当的 future 对象 Future<PingStatus>避免来自 Object 的令人讨厌的强制转换至PingStatus .

关于java - FutureTask.get的CancellationException异常后访问Callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29921698/

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