1.点击 IDE 的Edit Configurations 2.将-Dkotlinx.coroutines.debug填入VM options中: 在加上这个参数以后, 我们通过Thread.currentThread().name,就会自动为我们输出当前协程的名字。 // 这段代码看不懂没关系,忽略即可 // 请直接看后面的输出信息和注释 fun main() { runBlocking<Unit> { fun log(msg: Any...
CoroutineName 方便我们调试,其默认值是 "coroutine"。 👉 小技巧: 如果在启动时虚拟机选项配置了:-Dkotlinx.coroutines.debug Thread.currentThread().name 尾部会加入 @CoroutineName#CoroutineId 上下文的数据结构 你可能会在代码里看到 CoroutineContext 使用 + 连接,或...
开启JVM 的 -Dkotlinx.coroutines.debug 配置后运行以下代码: 共有三个协程。runBlocking 中的主协程(#1)和两个计算延迟值a(#2)和b(#3)的协程。它们都在 runBlocking 的上下文中执行,并且仅限于主线程。此代码的输出为: log 函数在方括号中打印线程名,可以看到协程都运行于主线程,线程名后附有有当前正在执...
协程的 Job 是上下⽂的⼀部分,并且可以使⽤ coroutineContext [Job] 表达式在上下⽂中检索 它: 1 println("My job is ${coroutineContext[Job]}") 在调试模式下,它将输出如下这些信息: 1 My jobis"coroutine#1":BlockingCoroutine{Active}@6d311334 请注意,CoroutineScope 中的 isActive 只是 coroutineC...
但要获取附带协程别名的线程名, 还得加JVM参数: -Dkotlinx.coroutines.debug 3.局部变量 有时,能够将一些线程局部数据传递到协程与协程之间是很方便的。 它们不受任何特定线程的约束 使用ThreadLocal 构建; 用 asContextElement(value = "launch") 转换为协程上下文并赋值. ...
Coroutine的简单理解 提到协程,很对人会把它和线程进行比较,就像提到线程,很多人会把它和进程进行比较,线程和进程分别是操作系统中的CPU调度单位和资源划分单位,它们在操作系统中有专门的数据结构代表,而协程在操作系统中没有专门的数据结构代表,所以协程并不是由操作系统创建和调度,它而是由程序自己创建和调度,由于不...
1、通过CoroutineScope创建 2、在协程中创建 第一种方式,首先如何通过CoroutineScope创建? 代码语言:txt AI代码解释 val scope = CoroutineScope(Job() + Dispatchers.Main) 代码语言:txt AI代码解释 @Suppress("FunctionName") public fun CoroutineScope(context: CoroutineContext): CoroutineScope = ...
GlobalScope.launch()属于协程构建器Coroutine builders,Kotlin 中还有其他几种 Builders,负责创建协程: runBlocking:T 使用runBlocking顶层函数创建,会创建一个新的协程同时阻塞当前线程,直到协程结束。适用于main函数和单元测试 launch 创建一个新的协程,不会阻塞当前线程,必须在协程作用域中才可以调用。它返回的是一个该...
We continue to highlight the upcoming changes in 1.4 release. In this blogpost, we want to describe a couple of important features related to coroutines: New functionality to conveniently debug corou
CoroutineName("name"): launch(CoroutineName("v1coroutine")){...} 1. 但要获取附带协程别名的线程名, 还得加JVM参数: -Dkotlinx.coroutines.debug 3.局部变量 有时,能够将一些线程局部数据传递到协程与协程之间是很方便的。 它们不受任何特定线程的约束 ...