上QQ阅读APP看书,第一时间看更新
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返回之前,当前的调用流程会一直被限制在这段逻辑里。