我有一个可调用对象和一个ExecutorService的集合。 当我调用All时,我得到一个未来对象的列表。 在 Future 完成之前,如何判断哪个 Future 对象映射到哪个 Callable? 事后我可以说,因为
法典:
ExecutorService es = .....;
Collection<Callables> uniqueCallables = .....; // each Callable is unique!
List<Future> futures = es.invokeAll(uniqueCallables);
// TODO--find unique Future A which is the future for Callable A!
根据 Java 参考,invokeAll(uniqueCallables)
将 List<Future>
中的顺序保留为 uniqueCallables.iterator()
生成的顺序:
退货: 代表任务的期货列表,在同一 迭代器为给定任务列表生成的顺序, 每个都已完成。
听起来你只需要能够从未来中查找原始可调用对象。如果你没有使用 invokeAll,你可以装饰包装 submit() 的 Executor,以创建一个 ContextualFuture,保留对原始可调用对象的引用。
/*pseudo example*/
class ContextualFuture<RETURN> implements Future<RETURN> {
private Callable<RETURN> callable;
private Future<RETURN> wrappedFuture;
public ContextualFuture(Callable<RETURN> callable, Future<RETURN> future){
this.callable = callable;
this.future = future;
}
// implemented/wrapped methods
}
class ContextualThreadPool {
private ExecutorService wrappedExecutor;
public <T> ContextualFuture<T> submit(Callable<T> task){
Future<T> f = wrappedExecutor.submit(task);
return new ContextualFuture<T>(task, f);
}
}