4

我是 java.util.concurrent.Future 的新手,有一些问题。如果我使用 Future 调用服务,我如何知道使用什么元素来调用服务?

这是一个例子:

  1. 对于每个 id,我使用 java.util.concurrent.Future 调用服务来填充一些额外的数据。

    Collection< Future< ObjectX>> future = new ArrayList< Future< ObjectX>>();  
    

    编辑###

     List< ObjectY> serviceResult= new ArrayList< ObjectY>();
    
    for (ObjectX obj: ids) 
     {  
       future.add(getAsyncInfo(obj);
     }
    
    //Because I have a lot of ids i need to call the service @async
    @Async
    public  Future< ObjectY> getAsyncInfo(ObjectX obj){
    
    return new AsyncResult<ObjectY>(callService(obj));
        ...
     }
    

得到响应

for (Future<ObjectY> futureResult : future) 
    {               
        serviceResult.add(futureResult.get());
    }

在这个阶段我有一个结果列表,我不知道什么结果属于什么 id

     ids.get(0).setResult(serviceResult.get(0))????
     ids.get(0).setResult(serviceResult.get(1))????
     ids.get(0).setResult(serviceResult.get(2))????
     ...

谢谢!

4

2 回答 2

2

我会这样做

class MyResult extends AsyncResult<Object> {
    Object id;
    public MyResult(Object id, Object res) {
        super(res);
        this.id = id;
    }
    public Object getId() {
        return id;
    }
}

@Async
public MyResult getAsyncInfo(Object id) {
    Object res = callService(id);
    return new MyResult(id, res);
}

现在您知道结果和 id。Id 和 result 可以是任何类型

于 2013-04-30T14:43:50.487 回答
0

您可以在这里做几件事。

  1. 让你的CollectionofFuture成为一个Map代替 ( Map<MyKey, Future<ObjectX>>) 的键Map应该是一些你可以用来映射回你的初始的方法ObjectX
  2. 让您的服务返回有关其返回值的一些信息,以帮助确定 ID。

对于1,我在想这样的事情:

//to kick off the tasks
Map<ObjectX, Future<ObjectY>> futures = new HashMap<ObjectX, Future<ObjectY>>();
for (ObjectX id: ids) 
{  
    futures.put(id, getAsyncInfo(id));
}

//...some time later...

//to fetch the results
for(Map.Entry<ObjectX, Future<ObjectY>> entry : futures.entrySet())
{
    final ObjectX id = entry.getKey();
    final Future<ObjectY> future = entry.getValue();
    final ObjectY objY = future.get();
    id.setResult(objY);
}
于 2013-04-30T14:40:57.567 回答