【备忘录】Kotlin协程(一)

《kotlin学习备忘录》
(1)

//CoroutineScope,协程本身
fun main() {
    //启动协程
    //在后台创建一个新的协程,不会堵塞当前线程
    GlobalScope.launch {
        delay(1000)
        println("kotlin Coroutine")
    }

    println("Hello")

    Thread.sleep(2000)

    println("World")

}

运行结果

Hello
kotlin Coroutine
World

(2)

fun main() {
    GlobalScope.launch {
        delay(1000)
        println("KOTLIN Coroutine")
    }

    println("HELLO")

    //创建一个新的协程,同时阻塞当前线程,直到协程结束
    runBlocking {
        delay(2000)
    }

    println("WORLD")
}

运行结果

HELLO
KOTLIN Coroutine
WORLD

(3)

fun main() = runBlocking {

    val myJob = GlobalScope.launch {
        delay(1000)
        println("MYJOB")
    }

    println("HELLO")

    //Suspends coroutine until this job is complete(暂停协程直到任务完成)
    //等待job所对应的协程执行完毕,然后在往下执行
    myJob.join()

    println("WORLD")
}

运行结果

HELLO
MYJOB
WORLD

(4)

//每一个协程构建器(包括runBlocking)都会向其代码块作用域中添加一个CoroutineScope实例,
//我们可以在该作用域中启动协程,而无需显式将其join到一起,这是因为外部协程会等待该作用域中的
//所有启动的协程全部完成后才会完成。
fun main() = runBlocking {

    launch {
        delay(1000)
        println("KOTLIN")
    }

    println("HELLO")
}

运行结果

HELLO
KOTLIN

(5)

/**
 * 除去不同的协程构建器所提供的协程作用域(Coroutine Scope)外,我们还可以通过Coroutine builder来声明自己的协程作用域。
 * 该构建器会创建一个协程作用域,并且会等待所有的启动的子协程全部完成自身才会完成。
 * runBlocking与CoroutineScope之间的主要区别在于,后者在等待所有子协程完后其任务时并不会阻塞当前的线程。
 *
 * 1.runBlocking并非挂起函数:也就是说,调用它的线程会一直位于该函数之中,知道协程执行完毕为止
 * 2.coroutineScope是挂起函数:也就是说,如果这其中的协程挂起,那么coroutineScope函数也会挂起。
 * 这样,创建coroutineScope的外层
 * 函数就可以继续在同一个线程中执行了,该线程会【逃离】coroutineScope之外,并且可以做其他事情。
 */
fun main() = runBlocking {
    launch {
        delay(10000)
        println("KOTLIN")
    }

    println("HELLO")

    coroutineScope {
        launch {
            delay(20000)
            println("my job2")
        }

        delay(5000)
        println("hello world")
    }

    println("welcome")
}

运行结果

HELLO
hello world
KOTLIN
my job2
welcome

(6)

/**
 * 被 suspend 关键字修饰的函数称为 挂起函数
 * 挂起函数 (suspending function)
 * 挂起函数可以像普通函数一样用在协程中,不过它的一个特性在于可以使用其他的挂起函数
 * *****挂起函数只能用在协程或者另外一个挂起函数中*****
 */

fun main() = runBlocking {
    launch {
        world()
    }
    println("调用了挂起函数")
}

suspend fun hello() {
    println("HELLO")
}

suspend fun world() {
    hello()
}

运行结果

调用了挂起函数
HELLO

(7)

/**
 *全局协程,类似守护线程(daemon thread)
 * 使用GlobalScope启动的活动协程并不会保持进程的生命,他们就像是守护线程一样
 * 守护线程特点:当主线程执行完毕之后,不管后台有多少守护线程,jvm都会结束自己的生命周期,那这些守护线程也都会被销毁
 */

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

            delay(400)
        }
    }

    Thread.sleep(2000)
}

运行结果

I am sleeping 0
I am sleeping 1
I am sleeping 2
I am sleeping 3
I am sleeping 4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值