协同(实验性)

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正式版时并不一定会支持这个特性。

results matching ""

    No results matching ""