我是 Finagle 的新手。我现在正在阅读某人的代码,发现 Future 对象在不同的连接操作中被重用。我的问题是,这会导致 Future 对象被执行多次(在每个连接中),还是只会执行一次并存储结果以供以后连接使用?
例子:
Future<A> a= b
.join(c)
.flatMap(new SomeFunctionReturningA());
Future<Tuple2<A, B>> future1 = a.join(b);
Future<D> future2 = future1.flatMap(new SomeFunctionReturningD());
future2.get();
那么 b 会被执行两次,还是只执行一次?
最佳答案
Future 只是一个值的容器,值只会被设置一次!
Future[T]
有不同的状态:
- 空
- 设置一个类型为T的值
- 设置异常
当您在 Future A
上使用带有函数 f
的 map/flatMap
时,您将创建一个新的 Future B
这将是前一个由函数 f
转换的结果。
注意:
- 如果 Future
A
尚未“填充”,您将有一个尚未填充的B
- 在
A
中设置值a
的线程也会执行f(a)
并在B<中设置值
- 如果
A
已经“填充”,那么 map/flatMap 的调用者也会执行f(a)
,但它不会重新计算A
的值。 - 您还可以使用
onSuccess/onFailure
,它只会注册一些代码,以便在 future 获得其值时执行。
关于java - Finagle Future 对象,它们可重用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089088/