Kotlin 处理异步代码的方法是使用协程,协程是可暂停计算的,即函数可以在某个点暂停执行,稍后再继续执行。
协程的一个好处是,对于开发人员来说,编写非阻塞代码与编写阻塞代码本质上是一样的,编程模型本身并没有真正改变。
下述代码演示了如何通过协程来并行加载网页:
val jobs = LinkExtractors.fromResource("seeds10.txt")
.map { scope.launch { session.loadDeferred("$it -expires 1s").also { println(it.url) } } }
jobs.joinAll()
或者全部加载完成后批处理:
val deferredPages = LinkedBlockingQueue<Deferred<WebPage>>()
val jobs = LinkExtractors.fromResource("seeds10.txt")
.map { scope.launch { async { session.loadDeferred(it) }.also(deferredPages::add) } }
// suspends current coroutine until all given jobs are complete.
jobs.joinAll()
deferredPages.map { it.await() }.forEach { println(it.url) }