一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情
本系列专栏 # Kotlin协程专栏
前言
上一篇文章说协程的概念时,我的理解是要把协程理解为类似线程的东西,即更轻量的Task,这样就更加容易和线程做比较,来显示出协程的设计思想。
但是线程我们接触了这么久,它是真实存在的,操作系统也是根据线程来进行CPU复用的,所以我们能看得见、摸得着协程吗 这里可以通过调试协程,来看到协程的信息。
正文
学习协程必须要会的就是调试协程,这样可以加深我们对协程的理解。
设置协程VM参数
正常来说,我们可以打印线程名,通过下面方法:
Thread.currentThread().name
复制代码
但是设置了协程VM参数后,即:“-Dkotlinx.coroutines.debug”这个参数在下面这种方法:
设置完这个后,再使用上面打印线程名的方法时,当代码运行在协程中时,就可以显示出协程的名字,比如下面代码:
fun main() = runBlocking(Dispatchers.IO) {
repeat(3) {
launch {
repeat(3) {
println(Thread.currentThread().name)
delay(100)
}
}
}
delay(5000L)
}
复制代码
打印结果如下:
这里DefaultDispatcher-worker-3 就是线程,而后面的 @coroutine#2 就是协程,它运行在前面的线程上。
从这点更可以看出,协程就相当于运行在线程上的Task,它和线程一样,也有自己的名字。
设置断点调试信息
除了打印协程名,还可以在断点时直接调试协程运行的信息,也就是使用IDE或者Android Studio,但是这里有个条件:
- IDE要升级到新版本,旧版本是不支持的,比如我这里的是 2021.1.1的蜜蜂版本。
- Kotlin的版本要新版本,比如我这里是1.6.10版本。
确保上面俩点后,在协程执行的地方就可以打断点了,并且选上显示协程:
这样设置后,在程序运行到协程时,要确保调试窗口开启了显示协程信息:
然后我们来看看协程调试窗口的具体信息:
上面信息很多,我们到后面仔细说明,这里可以看到一些简单信息:
- 协程名字就是coroutine#1。
- 它是运行在DefaultDispatcher-worker-1线程上。
- 当前协程的运行状态是RUNNING。 4.当前协程的创建调用栈,这里太复杂,后面再说。
总结
通过打印协程名字和断点调试协程信息,更加深了我们之前对协程的认识,让协程线程一样,都是可以看得到的东西,也更加印证了之前的观点,协程可以看成轻量级的线程,协程是运行在线程上的Task。