我有两个 ListenableFutures,它们在其他线程上完成。每个未来都有不同的类型,我希望在它们都完成时使用它们的结果。
有没有一种优雅的方法来使用番石榴来处理这个问题?
如果您想要某种类型安全,您可以执行以下操作:
class Composite {
public A a;
public B b;
}
public ListenableFuture<Composite> combine(ListenableFuture<A> futureA,
final ListenableFuture<B> futureB) {
return Futures.transform(futureA, new AsyncFunction<A, Composite>() {
public ListenableFuture<Composite> apply(final A a) throws Exception {
return Futures.transform(futureB, new Function<B, Compisite>() {
public Composite apply(B b) {
return new Composite(a, b);
}
}
}
}
}
ListenableFuture<A> futureA = ...
ListenableFuture<B> futureB = ...
ListenableFuture<Composite> result = combine(futureA, futureB);
在这种情况下Composite
可以是一个Pair<A, B>
如果您愿意,可以从 Apache Commons 获取。
此外,任何一个未来的失败都会导致最终的联合未来的失败。
另一个解决方案是看一下Trickle https://github.com/spotify/trickle来自 Spotify 团队。 GitHub README 有一个示例,展示了类似问题的解决方案。
毫无疑问还有其他解决方案,但这就是我脑海中突然出现的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)