+ 我要发布
我发布的 我的标签 发现
浏览器扩展
斑点象@Edge

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 } 运行上面的代码以查看结果。随意编辑它并再次运行! 更多信息请参见协程文档及教程。
我的笔记