程序员社区

Kotlin协程挂起函数与全局协程实例分析

Kotlin协程挂起函数与全局协程实例分析

挂起函数【suspend】

fun main() {
    //CoroutineScope.launch{}:
    //CoroutineScope.launch{}是最常用的Coroutine builders,不阻塞当前线程,在后台创建一个新协程,也可以指定协程调度器。
    //GlobalScope 协程构建器
    GlobalScope.launch {
        delay(1000)//此时不会阻塞线程,当指定的时间过后协程会恢复执行
        println("Kotlin Coroutines")
    }

    println("Hello")

    Thread.sleep(500)

    println("World")
}

这是因为 delay 是一个特殊的 挂起函数 ,它不会造成线程阻塞,但是会 挂起 协程,并且只能在协程中使用

那这次来探究一下这个关键字的作用,先来对这个关键字进行理论化的说明:

被suspend关键字所修饰的函数叫做挂起函数,挂起函数(suspending function)可以像普通函数一样用在协程当中,不过它的一个特性在于可以使用其他的挂起函数,重点:挂起函数只能用在协程或者另一个挂起函数中。”

fun main() = runBlocking {
    launch {
        world()
    }

    println("Welcome")
}

suspend fun hello() {
    delay(4000)
    println("Hello World")
}

suspend fun world() {
    hello()
}

RUN> ??????

Welcome
Hello World

Process finished with exit code 0
Kotlin协程挂起函数与全局协程实例分析插图
image-20210611173549700

只有一个挂起函数里面才能调用另-个挂起函数

全局协程

/*
    全局协程类似于守护线程(daemon thread)

    使用GlobalScope启动的活动协程并不会保持进程的生命,他们就像是守护线程一样
 */

fun main() {
    GlobalScope.launch {
        repeat(100) {
            println("I am sleeping $it ")

            delay(200)
        }
    }
    Thread.sleep(2000)
}

这里再单独对它进行一个阐述:“全局协程类似于守护线程(deamon thread)使用GlobalScope启动的活动协程并不会保持进程的生命,他们就像是守护线程一样。

RUN> ??????

I am sleeping 0 
I am sleeping 1 
I am sleeping 2 
I am sleeping 3 
I am sleeping 4 
I am sleeping 5 
I am sleeping 6 
I am sleeping 7 
I am sleeping 8 
I am sleeping 9 

Process finished with exit code 0

由于它是守护效果,所以当主线程退出,其协程中的代码也退出了,当然是不可能打印100次的啦

赞(0) 打赏
未经允许不得转载:IDEA激活码 » Kotlin协程挂起函数与全局协程实例分析

一个分享Java & Python知识的社区