首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种优雅的方法可以在指定的超时期限内处理多个期货?

有没有一种优雅的方法可以在指定的超时期限内处理多个期货?
EN

Stack Overflow用户
提问于 2016-12-13 22:24:09
回答 2查看 59关注 0票数 1

我的代码如下:这两个try...catch块太难看了。

我有两个请求,如果其中一个在超时期限内响应,我会将其添加到列表中,如果没有,我将向列表中添加一个null。

代码语言:javascript
复制
private List<String> getResult(Future future1, Future future2, long timeout) {
    String resp1= null;
    String resp2= null;
    Stopwatch stopwatch = Stopwatch.createStarted();

    try {
        resp1= future1.get(timeout, TimeUnit.MILLISECONDS);
    } catch (Exception e) {
        logger.error("req1 error", e);
    }
    //  calculate the time remaining
    long leftTime = timeout - stopwatch.elapsed(TimeUnit.MILLISECONDS);
    if (leftTime > 0) {
        try {
            resp2 = future2.get(leftTime, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            logger.error("req2 error", e);
        }
    }

    ArrayList<String> results = Lists.newArrayListWithCapacity(2);
    results.add(resp1);
    results.add(resp2);
    return results;
}
EN

回答 2

Stack Overflow用户

发布于 2016-12-13 22:29:24

除了消除代码重复之外,您可以做的并不多;只需将代码移到它自己的方法中,例如:

代码语言:javascript
复制
private String getResultFromFuture(Future future, long timeout, String message) {
  try {
    return future.get(timeout, TimeUnit.MILLISECONDS);
  } catch (Exception e) {
    logger.error(message, e);
  }
  return null;
}

或者类似的东西;例如,还通过提供将结果添加到的列表;而不是返回它。

票数 1
EN

Stack Overflow用户

发布于 2016-12-13 22:45:21

您可以尝试这样的操作,并为两个Future对象调用它。

代码语言:javascript
复制
    public void process(Future<String> f, int timeout, List<String> list) throws InterruptedException, ExecutionException{
                try{
                    list.add(f.get(10000, TimeUnit.MILLISECONDS));
                }catch (TimeoutException e) {
                    // add what you want
                }


}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41123446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档