1.3.1 Future

Future<T>是JDK 1.5版本时就引入的接口。它有一个get方法,能够同步阻塞地返回Future对应的异步任务的结果,所以如果我们有个返回Future<Bitmap>的函数如代码清单1-13所示,问题是不是就简单些了呢?

代码清单1-13 返回Future的异步函数


fun bitmapFuture(url: String): Future<Bitmap> {
  return ioExecutor.submit(Callable {
    download(url)
  })
}

于是我们简化一下前面用了并发工具才能写出的循环逻辑,如代码清单1-14所示。

代码清单1-14 使用Future实现异步结果的循环


val bitmaps = urls.map {
  bitmapFuture(it)
}.map {
  it.get()
}

这段代码已经比代码清单1-12清楚多了,读者很容易明白我们用一串url异步请求并最终得到了一串对应的bitmap,巧妙的是,这里面的顺序还能保持一致,因为get只在结果就绪时才会返回,所以bitmaps的顺序也与urls严格对应。

不过真是“成也萧何,败也萧何”,虽然我们可以触发异步任务的执行,并且在需要结果的位置通过get来拿到结果,但一旦我们调用了其中的某一个get,当前调用也就被阻塞了,在所有的get返回之前,当前的调用流程会一直被限制在这段逻辑里。