1.1 What 协程
在学习 Kotlin 过程中,避免不了对协程的学习。但是协程这个概念并不是由Kotlin 率先提出的,资料记载 1963 年就提出了协程的概念。人们通常那线程和协程做对比,很多人都说协程是一个轻量级的线程,这种说法很容易让人理解,但是却又有点难理解。因为在我的认知中线程已经是操作系统能够调度的最小运行单位了。咋还能有一个比线程更小的东西存在?因为协程并不是操作系统控制,而是应用本身控制。是开发语言级别的调度。这里关于协程的理解可以参考扔物线的协程视频,里面介绍的很详细。
1.2 How 协程
在 Kotlin 代码中,我们只需要调用GlobalScope.luanch{}
,即可启动一个协程,下面是一个简单的例子
import kotlinx.coroutines.GlobalScope //引包
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
fun main() {
GlobalScope.launch { // 启动一个协程
delay(1000L) // 延迟 1 秒
println("coroutines") // 输出
}
println("main") //输出
Thread.sleep(2000L) //延迟两秒,阻塞式的,确保协程中的方法执行
}
上述代码已经开启了一个协程,输出的结果为
main
coroutines
可以看到协程中的方法是在主线程输出之后执行的,协程的创建并不会导致主线程的阻塞。
这里只是简单的创建协程可使用。后续我们再详细说明协程的其他使用方法
注意:
如果在 IDEA 中引包没有协程的包,需要将协程的包添加到当前项目,打开项目设置窗口,按照下面图示添加即可。
1.3 Why 协程
在上面例子中,我们改造一下,重复创建 1000个协程,并且输出 hello,
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking { //阻塞主线程(后续介绍)
repeat(10000) {
launch {
println("Hello")
}
}
}
}
如果换成 Java 线程的方式,创建如此多的线程是消耗资源的,甚至可能造成OOM,当然如今的电脑配置很强,可能触发不了 OOM,而在协程中,这里只创建了一个主线程,其他协程都是运行在主线程中的,没有线程的开销。从原理上我们就可以分析出来,协程在这方面还是有这不错的优越性的。毕竟 Java 现在也支持协程了。