协同(实验性)
Kotlin 1.1的核心新增特性就是协同,使之支持async / await , yield和相似的变成模式。这是库设计的一部分而不是语言本身,所以你不绑定到任何特定的编程范式或并发库。
协同是一个很高效、轻量级的暂停/启动线程。
kotlinx.coroutines中的async / await实现:
fun asyncOverlay() = async(CommonPool) {
// 启动两个线程
val original = asyncLoadImage("original")
val overlay = asyncLoadImage("overlay")
applyOverlay(original.await(), overlay.await())
}
// 在UI线程启动一个新的协同程序
launch(UI) {
// 异步等待async overlay执行完毕
val image = asyncOverlay().await()
// UI中显示结果
showImage(image)
}
此处,async启动了一个协同程序,当使用了await()函数时,协同程序的执行会被阻塞并等待其执行完毕。执行完毕后,协同程序将会被激活继续执行。
标准库使用协同程序来支持创建序列的yield和yieldAll函数。在这样的序列中,返回序列元素的代码块会在每个元素被取出时被阻塞,并且会在下一个元素被请求是重新执行。
val seq = buildSequence {
for (i in 1..5) {
yield(i * i)
}
yieldAll(26..28)
}
println(seq.toList())
请注意这个特性是试验阶段的,意味着在最终的1.1正式版时并不一定会支持这个特性。