Kotlin-27-子协程

目录

1、子协程

2、父协程


1、子协程

当一个协程在其它协程在中启动的时候, 它将通过 CoroutineScope.coroutineContext 来承袭上下文,并且这个新协程的 Job 将会成为父协程作业的 子作业。当一个父协程被取消的时候,所有它的子协程也会被递归的取消。

然而,当使用 GlobalScope 来启动一个协程时,则新协程的作业没有父作业。 因此它与这个启动的作用域无关且独立运作。

fun main() = runBlocking<Unit> {
    // 启动一个协程来处理某种传入请求(request)
    val request = launch {
        // 孵化了两个子作业, 其中一个通过 GlobalScope 启动
        GlobalScope.launch {
            println("job1: 我用GlobalScope启动,并且独立执行,不受父协程影响!")
            delay(1000)
            println("job1: 我没有被取消")
        }
        // 另一个则承袭了父协程的上下文
        launch {
            delay(100)
            println("job2: 我是协程的孩子")
            delay(1000)
            println("job2: 父类被取消后,我也别取消了,所以这里不会执行。")
        }
    }
    delay(500)
    request.cancel() // 取消请求(request)的执行
    delay(1000) // 延迟一秒钟来看看发生了什么
}
//输出结果
job1: 我用GlobalScope启动,并且独立执行,不受父协程影响!
job2: 我是协程的孩子
job1: 我没有被取消

2、父协程

一个父协程总是等待所有的子协程执行结束。父协程并不显式的跟踪所有子协程的启动,并且不必使用 Job.join 在最后的时候等待它们完成。

fun main() = runBlocking<Unit> {
    // 启动一个协程来处理某种传入请求(request)
    val request = launch {
        repeat(3) { i -> // 启动少量的子作业
            launch  {
                delay((i + 1) * 200L) // 延迟 200 毫秒、400 毫秒、600 毫秒的时间
                println("协程 $i 执行完成")
            }
        }
        println("request: 父协程执行完成,但是我的子协程仍然活着,直到它们执行完成")
    }
    request.join() // 等待请求的完成,包括其所有子协程
    println("现在所有的协程都执行完成了")
}
//输出结果
request: 父协程执行完成,但是我的子协程仍然活着,直到它们执行完成
协程 0 执行完成
协程 1 执行完成
协程 2 执行完成
现在所有的协程都执行完成了

 

发布了82 篇原创文章 · 获赞 16 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/qq_34589749/article/details/103743609
今日推荐