快速入门Kotlin⑤协程

基础

本质上,协程是轻量级的线程。

runBlocking 用于在当前线程中阻塞执行协程代码直到协程执行完毕。它通常用于在主函数或测试代码中使用,以确保协程代码的顺序执行。

GlobalScope.launch 是一个顶级函数,用于在全局范围内启动一个新的协程。它创建一个顶级协程,该协程的生命周期与应用程序的生命周期相同。

delay 是协程库中的一个挂起函数,用于延迟指定的时间。它会不会阻塞整个线程,只会暂停当前协程的执行,并在指定的时间过后恢复执行。

桥接阻塞与非阻塞的世界

fun main() {
    GlobalScope.launch { // 在后台启动一个新的协程并继续
        delay(1000L) // 非阻塞的等待 1 秒钟(默认时间单位是毫秒)
        println("World!") // 在延迟后打印输出
    }
    println("Hello,") // 协程已在等待时主线程还在继续
    runBlocking {     // 但是这个表达式阻塞了主线程
        delay(2000L)  // ……我们延迟 2 秒来保证 JVM 的存活
    }
}
//输出:
//Hello,
//World!

等待一个作业

问题:显式阻塞比较Hack;

解决方案:使用join()去实现非阻塞方式等待所启动的后台 Job 执行结束。

//显式(以非阻塞方式)等待所启动的后台 Job 执行结束:
fun main() = runBlocking {
    val job = GlobalScope.launch { // 启动一个新协程并保持对这个作业的引用
        delay(1000L)
        println("World!")
    }
    println("Hello,")
    job.join() // 等待直到子协程执行结束
}

//输出:
//Hello,
//World!

结构化并发

问题:GlobalScope.launch 会创建一个顶层协程。虽然它很轻量,但它运行时仍会消耗一些内存资源。可能会造成:内存不足、延迟太久等各种问题。

解决方案:在执行操作所在的指定作用域内启动协程, 而不是像通常使用线程(线程总是全局的)那样在 GlobalScope 中启动。

//显式(以非阻塞方式)等待所启动的后台 Job 执行结束。
//在这个作用域中启动协程而无需显式 join 之,因为外部协程(示例中的 runBlocking)直到在其作用域中启动的所有协程都执行完毕后才会结束。
fun main() = runBlocking {// this: CoroutineScope
    launch { // 在 runBlocking 作用域中启动一个新协程
        delay(1000L)
        println("World!")
    }
    println("Hello,")
}

coroutineScope 和 runBlocking 都会阻塞当前线程,但它们之间的主要区别是:runBlocking 方法会阻塞当前线程来等待, 而 

相关推荐

  1. 快速入门Kotlin

    2024-04-05 11:00:02       43 阅读
  2. Kotlin

    2024-04-05 11:00:02       58 阅读
  3. Kotlin SharingStarted

    2024-04-05 11:00:02       57 阅读
  4. kotlin学习总结

    2024-04-05 11:00:02       56 阅读
  5. kotlin相关

    2024-04-05 11:00:02       32 阅读
  6. Kotlin最佳实践

    2024-04-05 11:00:02       19 阅读
  7. Kotlin->Kotlin作用域

    2024-04-05 11:00:02       29 阅读
  8. Kotlin : Coroutines —简单应用

    2024-04-05 11:00:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 11:00:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 11:00:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 11:00:02       82 阅读
  4. Python语言-面向对象

    2024-04-05 11:00:02       91 阅读

热门阅读

  1. 速盾:cdn高防御服务器租用有哪些好处

    2024-04-05 11:00:02       36 阅读
  2. Spark面试整理-解释Spark Streaming是什么

    2024-04-05 11:00:02       27 阅读
  3. AcWing 787. 归并排序——算法基础课题解

    2024-04-05 11:00:02       36 阅读
  4. pytorch中的torch.nn.Linear

    2024-04-05 11:00:02       25 阅读
  5. Python爬虫实战-1

    2024-04-05 11:00:02       32 阅读
  6. 设计模式:抽象工厂

    2024-04-05 11:00:02       51 阅读
  7. 飞机降落(c++实现)

    2024-04-05 11:00:02       30 阅读
  8. P1914 小书童——凯撒密码,学会字符串的拆分

    2024-04-05 11:00:02       37 阅读
  9. odoo中创建OWL组件

    2024-04-05 11:00:02       32 阅读
  10. php获取1688拍立淘api

    2024-04-05 11:00:02       34 阅读