Kotlin runBlocking 与 laucner标签 by协程
Posted 安果移不动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin runBlocking 与 laucner标签 by协程相关的知识,希望对你有一定的参考价值。
首先要先了解下什么是协程
什么是协程?
协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。
协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。
协程很重要的一点就是当它挂起的时候,它不会阻塞其他线程。协程底层库也是异步处理阻塞任务,但是这些复杂的操作被底层库封装起来,协程代码的程序流是顺序的,不再需要一堆的回调函数,就像同步代码一样,也便于理解、调试和开发。它是可控的,线程的执行和结束是由操作系统调度的,而协程可以手动控制它的执行和结束。
然后了解下什么是快乐星球。。-》
导入依赖
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
runBlocking
suspend fun main() {
println("线程id:${Thread.currentThread().id}")
val job = GlobalScope.launch {
delay(6000)
println("协程执行结束 -- 线程id:${Thread.currentThread().id}")
}
job.join()
println("协程执行结束")
}
runBlocking 启动的协程任务会阻断当前线程,直到该协程执行结束。当协程执行结束之后,页面才会被显示出来。
下面进行laucner标签
suspend fun main() {
println("线程id:${Thread.currentThread().id}")
val job = GlobalScope.launch {
delay(6000)
println("协程执行结束 -- 线程id:${Thread.currentThread().id}")
}
job.join()
println("协程执行结束")
}
job 拥有以下几个常用的方法
//Job中的方法
job.isActive
job.isCancelled
job.isCompleted
job.cancel()
jon.join()
看起来和runBlocking 没什么两样。。因为 多了suspend 把他给挂起来了。这里是运行在了java里面 所以他好像保持了同步。
那么运行到android 工程会是怎么样的子呢 我们拭目以待
todo!
从执行结果看出,launch
不会阻断主线程。
以上是关于Kotlin runBlocking 与 laucner标签 by协程的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 多平台:如何在没有 runBlocking 的情况下以阻塞方式启动协程
Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )
Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )
Kotlin 协程协程启动 ① ( 协程构建器 | launch 构建器 | async 构建器 | runBlocking 函数 | Deferred 类 )
Kotlin 协程协程启动 ① ( 协程构建器 | launch 构建器 | async 构建器 | runBlocking 函数 | Deferred 类 )