公众号「稀有猿诉」 原文链接 Kotlin进阶之协程从专家到出家
协程Coroutine是一种轻量级的实现异步的方式,是代码执行的控制框架,是最新式的并发编程范式。它在使用上大大简化了以往多线程并发带来的种种麻烦(如状态同步和锁),最大的优势就是它是纯编程语言层面实现的,不受制于操作系统,因此它不会阻塞。在前两篇基础之上,今天再来深入的理解一下各种概念,并脱去协程华丽的外衣一探它的本质。
本篇为协程三步曲中的终篇:
- 初级篇:Kotlin进阶之协程从入门到放弃
- 高级篇:Kotlin进阶之协程从上车到起飞
- 终极篇:Kotlin进阶之协程从专家到出家
不过如此
协程是最新式的并发编程范式,所有文章都会大量的提及同步,异步,并发和并行等,需要先理解一下这些词语到底是什么意思。
什么是异步(Asynchronous)
在解释什么是协程之前,得先要理解什么是异步(Asynchronous)。异步也就是说程序是非同步的(Non synchronous),并不是按照顺序来执行的。这么说依然很绕,我们来一个简单的例子。比如有这样一个语句:
fun main(args: Array<String>) {
println("world of Coroutine!") // 1
print("Hello ...") // 2
}
这个代码的输出很明显是
world of Coroutine
Hello ...
函数的执行是从上到下按我们写的顺序执行的,这就是顺序执行的意思,虽然说编译器会做一些指令重排以期对字节码进行一些优化,但有一个前提就是它不会改变程序的正确性,比如后面语句如果需要前面表达的结果时,一定能保证它们的执行顺序。同步的意思是,执行一个子函数,子函数会占用CPU,直到它运行结束再返回到调用它的函数,继续运行并能把结果带回给调用者,这即是同步的意思。比如这里的println,println没有执行完时,后面的语句是不会执行的。
异步的意思是函数语句的执行并不是按照我们写的顺序来运行的。比如说,前面的函数,如何能输出"Hello …world of Coroutine" ?这就需要让代码实现异步,非顺序的执行。有多种方式,协程就可以实现异步:
fun main() = runBlocking {
// this: CoroutineScope
launch {
// launch a new coroutine and continue
delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
println("world of Coroutine!") // print after delay
}
print("Hello ...") // main coroutine continues while a previous one is delayed
}
// Hello ...world of Coroutine!
什么是并发(Concurrency)
并发concurrency就是代码同时开始运行,并发,并驾齐驱同时出发,英文是concurrent programming或concurrency,但出发了后是并行还是串行,并不管或者说不是重点。
异步是并发的前提,如果无法异步,那就不可能让代码同时开始运行,自然也就无法并发。并发是为了提高代码的运行响应