我是java.util.concurrent.Future的新手并且有一些问题。如果我使用Future调用服务,我如何知道用于调用服务的元素?
以下是一个例子:
对于每个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))????
...
谢谢!
答案 0 :(得分: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和结果可以是任何类型
答案 1 :(得分:0)
你可以在这里做几件事。
Collection
Future
代替Map
代替Map<MyKey, Future<ObjectX>>
Map
的密钥应该是您可以使用的一些方法回到最初的ObjectX
。对于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);
}