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
只有一个挂起函数里面才能调用另-个挂起函数
全局协程
/*
全局协程类似于守护线程(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次的啦