
协程是Kotlin语言提供的强大功能。 我已经尝试过了,我真的很喜欢它。
本文的目的是帮助您了解Corutins。 阅读时请小心,您将成功。
让我们从Corutin的正式定义开始。
协程是编写异步,非阻塞代码的新方法。
阅读此定义时出现的第一个问题是协程与流程有何不同?
协程是轻量级的流程。 轻量级线程意味着它不与本地线程绑定,因此不需要将上下文切换到处理器,因此速度更快。
“未附加到本机线程”是什么意思?
协程可以在许多编程语言中找到。
基本上,Corutin有两种类型:
Kotlin在没有堆栈的情况下实现了协程-这意味着协程没有自己的堆栈,因此它们不与本机线程绑定。
协程和流都是多任务的。 但是区别在于线程是由操作系统控制的,协程是用户。
现在,您可以有意识地阅读和理解Kotlin官方网站的摘录:
协程可以方便流动的形式表示。 像线程一样,协程可以并行工作,彼此等待并进行通信。 最大的区别是协程非常便宜,几乎是免费的:我们可以成千上万个协程创建它们,而性能却很少。 流很昂贵。 即使对于现代机器,一千个线程也可能是一个严重的问题。
让我们看看如何使用协同程序
那么,如何启动协程(类似于启动线程)?
启动协程有两个功能:
在Kotlin Coroutines中启动{}与异步{}
区别在于launch{}
返回任何内容,而async{}
返回一个具有await()
函数的Deferred
实例,该函数返回协程的结果,就像Java中的Future
一样,我们执行future.get()
以获取结果。
让我们来看看使用启动{}
fun main(args: Array<String>) { println("Kotlin Start") launch(CommonPool) { delay(2000) println("Kotlin Inside") } println("Kotlin End") }
// The output will be // Kotlin Start // Kotlin End // Kotlin Inside
此代码将在此线程池中启动新的协程。 在这种情况下,我们使用CommonPool ,后者使用ForkJoinPool.commonPool() 。 在基于协程的程序中流仍然存在,但是一个线程可以运行很多协程,因此不需要太多线程。
让我们尝试一件事:
fun main(args: Array<String>) { delay(2000) }
如果直接在主函数中执行此操作,则会收到错误消息:
只能从协程或其他中断函数调用中断函数。
延迟函数是一个中断函数,因此我们只能从协程或其他中断函数调用它。
让我们解决这个问题:
fun main(args: Array<String>) { runBlocking { delay(2000) } }
另一个例子:
suspend fun doWorkFor1Seconds(): String { delay(1000) return "doWorkFor1Seconds" }
suspend fun doWorkFor2Seconds(): String { delay(2000) return "doWorkFor2Seconds" }
// Serial execution private fun doWorksInSeries() { launch(CommonPool) { val one = doWorkFor1Seconds() val two = doWorkFor2Seconds() println("Kotlin One : " + one) println("Kotlin Two : " + two) } }
// The output is // Kotlin One : doWorkFor1Seconds // Kotlin Two : doWorkFor2Seconds
现在让我们看看使用异步{}
// Parallel execution private fun doWorksInParallel() { val one = async(CommonPool) { doWorkFor1Seconds() } val two = async(CommonPool) { doWorkFor2Seconds() } launch(CommonPool) { val combined = one.await() + "_" + two.await() println("Kotlin Combined : " + combined) } } // The output is // Kotlin Combined : doWorkFor1Seconds_doWorkFor2Seconds
因为 async{}
我们使用async{}
,因此可以调用await()
来获取结果。
学习愉快;)