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 と結果は任意の型である可能性があります

于 2013-04-30T14:43:50.487 に答える
0

ここでできることがいくつかあります。

  1. あなたCollectionの of をFuture代わり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 に答える