有没有一种简单的方法可以将Future<Future<T>>转变为Future<T>?

2022-09-02 10:48:22

我有一些代码可以将请求提交给另一个线程,该线程可能会也可能不会将该请求提交到另一个线程。这将产生返回类型 。有没有一些不令人发指的方式可以立即将其转变为等待整个未来链条的完成?Future<Future<T>>Future<T>

我已经使用番石榴库来处理其他有趣的并发功能,并作为Google Collections及其良好运行的替代品,但我似乎找不到适合这种情况的东西。


答案 1

另一个使用番石榴库的可能实现,并且要简单得多。

import java.util.concurrent.*;
import com.google.common.util.concurrent.*;
import com.google.common.base.*;

public class FFutures {
  public <T> Future<T> flatten(Future<Future<T>> future) {
    return Futures.chain(Futures.makeListenable(future), new Function<Future<T>, ListenableFuture<T>>() {
      public ListenableFuture<T> apply(Future<T> f) {
        return Futures.makeListenable(f);
      }
    });
  }
}

答案 2

Guava 13.0添加了Futures.dereference来做到这一点。它需要一个 ,而不是一个普通的 。(在 plain 上运行需要一个 makeListenable 调用,每个调用都需要一个用于任务生存期的专用线程(该方法的新名称 JdkFutureAdapters.listenInPoolThread 更清楚地表明了这一点)。ListenableFuture<ListenableFuture>Future<Future>Future


推荐