协程粉碎计划 | 调试协程

·  阅读 214
协程粉碎计划 | 调试协程

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

本系列专栏 # Kotlin协程专栏

前言

上一篇文章说协程的概念时,我的理解是要把协程理解为类似线程的东西,即更轻量的Task,这样就更加容易和线程做比较,来显示出协程的设计思想。

但是线程我们接触了这么久,它是真实存在的,操作系统也是根据线程来进行CPU复用的,所以我们能看得见、摸得着协程吗 这里可以通过调试协程,来看到协程的信息。

正文

学习协程必须要会的就是调试协程,这样可以加深我们对协程的理解。

设置协程VM参数

正常来说,我们可以打印线程名,通过下面方法:

Thread.currentThread().name
复制代码

但是设置了协程VM参数后,即:“-Dkotlinx.coroutines.debug”这个参数在下面这种方法:

vm.gif

设置完这个后,再使用上面打印线程名的方法时,当代码运行在协程中时,就可以显示出协程的名字,比如下面代码:

fun main() = runBlocking(Dispatchers.IO) {
    repeat(3) {
        launch {
            repeat(3) {
                println(Thread.currentThread().name)
                delay(100)
            }
        }
    }

    delay(5000L)
}
复制代码

打印结果如下:

image.png

这里DefaultDispatcher-worker-3 就是线程,而后面的 @coroutine#2 就是协程,它运行在前面的线程上。

从这点更可以看出,协程就相当于运行在线程上的Task,它和线程一样,也有自己的名字。

设置断点调试信息

除了打印协程名,还可以在断点时直接调试协程运行的信息,也就是使用IDE或者Android Studio,但是这里有个条件:

  1. IDE要升级到新版本,旧版本是不支持的,比如我这里的是 2021.1.1的蜜蜂版本。
  2. Kotlin的版本要新版本,比如我这里是1.6.10版本。

确保上面俩点后,在协程执行的地方就可以打断点了,并且选上显示协程:

image.png

这样设置后,在程序运行到协程时,要确保调试窗口开启了显示协程信息:

显示协程.gif

然后我们来看看协程调试窗口的具体信息:

image.png

上面信息很多,我们到后面仔细说明,这里可以看到一些简单信息:

  1. 协程名字就是coroutine#1。
  2. 它是运行在DefaultDispatcher-worker-1线程上。
  3. 当前协程的运行状态是RUNNING。 4.当前协程的创建调用栈,这里太复杂,后面再说。

总结

通过打印协程名字和断点调试协程信息,更加深了我们之前对协程的认识,让协程线程一样,都是可以看得到的东西,也更加印证了之前的观点,协程可以看成轻量级的线程,协程是运行在线程上的Task

分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改