【2025最新版Kotlin教程】Kotlin第一行代码系列第十六课-协程创建

62 阅读2分钟
【2025最新版Kotlin教程】Kotlin第一行代码系列第十六课-协程创建

为了看在那个线程上,我们改下Android Studio的配置。点击在底下run项上,然后再点击左边像把手的图标,在弹出框中的VM options项里面输入:-Dkotlinx.coroutines.debug

创建协程示例代码:
fun main() {
    /**
     * 方式1:launch
     * 注意:在真实项目开发中,是不用GlobalScope的
     */
    GlobalScope.launch {
        //这里就是协程域了,可以调任何协程的方法
        println("Hello 协程1")
        // 协程的延迟操作,后面的代码要等延迟跑完
         delay(1000L)
         println("Hello 协程")
    }
    // 延迟主线程,要不main函数一瞬间就跑完,进程就结束了,自然你就看不到上面协程的输出了
    Thread.sleep(2000L)

    /**
     * 分析下运行顺序
     */
    GlobalScope.launch {
        println("1")
        delay(1000L)
        println("2")
    }
    println("3")
    Thread.sleep(2000L)
    println("4")
    /**
     * 输出结果是3,1,2,4
     * 因为3所在的位置和创建协程是同一层次代码,它会往下跑,因为创建协程需要时间,因此3先输出
     * 接着整个线程睡眠2s,2s过程中,上面GlobalScope.launch协程创建肯定完成了,就开始输出1,接着协程延迟1s,输出2
     * 睡眠够了2s,接着输出4
     */


    /**
     * 方式2:runBlocking 启动协程
     * 看下它顺序呢
     * 这个在开发中也不用的
     * 因为:阻塞
     */
    runBlocking {
        println("11")
        delay(1000L)
        println("22")
    }
    println("33")
    Thread.sleep(2000L)
    println("44")
    /**
     * 输出是11,22,33,44
     * 因为使用 runBlocking 启动的协程会阻塞当前线程的执行
     */

    /**
     * 方式3:async 启动协程
     * 不过它不能单独使用,它要在协程域中创建协程
     */
    // 这是错的
//    async{
//
//    }
    // 分析下它的运行结果
    runBlocking {
        println("111")
        async {
            println("333")
        }
        println("222")
    }
    // 输出是111,222,333 因为async是不阻塞的

    // 这个输出结果呢
    runBlocking {
        println("1111")
        val result = async {
            println("3333")
            "4444"
        }
        println(result.await())
        println("2222")
    }
    // 输出是1111,3333,4444,2222

    /**
     * 方式4:lifecycleScope.launch{}
     * 推荐使用:在Android开发中的Activity和fragment推荐用
     */
    //这里直接用时报错的,因为没有Activity和Fragment作用域
//    lifecycleScope.launch(Dispatchers.IO){
//
//    }
}
整个kotlin教程的源码项目结构图:

在这里插入图片描述
有问题或者完整源码的可以看简介联系我,也可以私信我,我每天都看私信的