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不会阻断主线程。

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/117558773#comments_21956945