Kotlin中的协程
Kotlin1.1的关键新特性是协程,它带来了future/await、yield以及类似的编程模式的支持。Kotlin的设计中的关键特性是协程执行的实现是语言库的一部分,而不是语言的一部分,所以你不必绑定任何特定的编程范式或并发库。
协程实际上是一个轻量级的线程,可以挂起并稍后恢复。协程通过挂起函数支持:对这样的函数的调用可能会挂起协程,并启动一个新的协程,我们通常使用匿名挂起函数(即挂起lambda表达式)。
我们来看看在外部库kotlinx.coroutines中实现的:
// 在后台线程池中运行该代码
fun asyncOverlay() = async(CommonPool) {
// 启动两个异步操作
val original = asyncLoadImage("original")
val overlay = asyncLoadImage("overlay")
// 然后应用叠加到两个结果
applyOverlay(original.await(), overlay.await())
}
// 在 UI 上下文中启动新的协程
launch(UI) {
// 等待异步叠加完成
val image = asyncOverlay().await()
// 然后在 UI 中显示
showImage(image)
}
这里,async{......}启动一个协程,当我们使用await()时,挂起协程的执行,而执行正在等待的操作,并且在等待的操作完成时恢复(可能在不同的线程上)。
标准库通过yield和yieldAll函数使用协程来支持惰性生成序列。在这样的序列中,在取回每个元素之后挂起返回序列元素的代码块,并在请求下一个元素时恢复。这里有一个例子:
import kotlin.coroutines.experimental.*
fun main(args: Array<String>) {
//sampleStart
val seq = buildSequence {
for (i in 1..5) {
// 产生一个 i 的平方
yield(i * i)
}
// 产生一个区间
yieldAll(26..28)
}
// 输出该序列
println(seq.toList())
//sampleEnd
}
运行上面的代码以查看结果。随意编辑它并再次运行!
更多信息请参见协程文档及教程。
我的笔记