• 协程的创建


    GlobalScope.launch

    • 使用(代码会在当前线程所有内容执行完成之后再执行)

      //新建线程,执行 "延时 1 秒,打印当前线程名称" 的代码
      GlobalScope.launch{
                  delay(1000)
                  Log.d(TAG, "createCoroutinesOne: ${Thread.currentThread().name}")
              }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      //在主线程中执行 "延时 1 秒,打印当前线程名称" 的代码
      GlobalScope.launch(Dispatchers.Main){
                  delay(1000)
                  Log.d(TAG, "createCoroutinesOne2: ${Thread.currentThread().name}")
              }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      //新建线程,执行 "延时 1 秒,打印当前线程名称" 的代码,在调用后,直接执行
      GlobalScope.launch(newSingleThreadContext("bin"), CoroutineStart.DEFAULT){
                  delay(1000)
                  Log.d(TAG, "createCoroutinesOne4: ${Thread.currentThread().name}")
              }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 参数

      public fun CoroutineScope.launch(
          context: CoroutineContext = EmptyCoroutineContext,
          start: CoroutineStart = CoroutineStart.DEFAULT,
          block: suspend CoroutineScope.() -> Unit
      ): Job {
      ...
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • context: CoroutineContext
        协程调度器
      • start: CoroutineStart
        协程的启动模式
      • block: suspend CoroutineScope.()
        执行内容

    runBlocking

    • 使用(代码会在调用位置直接执行。runBlocking 作用域内 launch 启动的代码,会在runBlocking 代码块其他代码执行完之后继续执行)

      runBlocking {
                  delay(1000)
                  Log.d(TAG, "createCoroutinesTwo3: ${Thread.currentThread().name}")
              }
      
      • 1
      • 2
      • 3
      • 4
      runBlocking{
                  launch {
                      delay(1000)
                      Log.d(TAG, "createCoroutinesTwo: ${Thread.currentThread().name}")
                  }
                  Log.d(TAG, "createCoroutinesTwo2: ${Thread.currentThread().name}")
              }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 参数

      public fun <T> runBlocking(
      context: CoroutineContext = EmptyCoroutineContext,
       block: suspend CoroutineScope.() -> T): T {
      ...
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • context: CoroutineContext = EmptyCoroutineContext
      协程调度器

    • block: suspend CoroutineScope.()
      执行内容

    Dispatchers(协程调度器)

    • Dispatchers.Default
      在线程池中执行。适合CPU密集型的任务,比如解析JSON文件,排序一个较大的list
    • Dispatchers.Main
      表示主线程
    • Dispatchers.IO
      在线程池中执行。针对磁盘和网络IO进行了优化,适合IO密集型的任务,比如:读写文件,操作数据库以及网络请求
    • Dispatchers.Unconfined
      在调用的线程直接执行
    • newSingleThreadContext(name: String)
      使用新的线程

    CoroutineStart(启动模式)

    • CoroutineStart.DEFAULT
      默认,不传或传入此参数会立即执行协程
    • CoroutineStart.LAZY
      launch后不立即执行,需要获取其job发起执行
    • CoroutineStart.UNDISPATCHED
      在协程代码块中优先级更高,更快执行
    • CoroutineStart.ATOMIC
      执行前不可取消的
  • 相关阅读:
    【LeetCode热题100】--230.二叉搜索树中第K小的元素
    【vulhub】PostGresql远程代码执行漏洞复现(CVE-2018-1058)
    Vue3中如何通过内嵌iframe传递参数与接收参数
    Pytorch plt.scatter()函数用法
    Android 进入 Activity 时禁止弹出输入法
    基于springboot实现漫画网站管理系统项目【项目源码+论文说明】计算机毕业设计
    Python生成器
    使用swc 替换ts-loader 加速构建webpack-vue-tsx项目
    C++STL详解(二)— string类模拟实现
    11月22日:操作系统实验杂记(文本编辑器vim,查看文件内容cat命令,创建并使用Makefile文件,虚拟机共享文件夹)
  • 原文地址:https://blog.csdn.net/qq1302526289/article/details/125886977