Kotlin-Coroutines中的async与await异步协程管理

 更新时间:2023年10月17日 12:01:25   作者:ZoranLee  
这篇文章主要为大家介绍了Kotlin-Coroutines中的async与await异步协程管理,提升程序性能解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Coroutines

官网说明

什么是协程?(摘自官网)

  • Asynchronous or non-blocking programming is an important part of the development landscape. 用于异步或非阻塞 编程。

简单概括 

  • 同步的方式去编写异步执行的代码
  • 协程依赖于线程
  • 协程挂起时不需要阻塞线程,几乎是无代价的.
  • 一个线程中可以创建N个协程

协程的创建/启动

  • runBlocking 启动一个新的协程并阻塞调用它的线程
  • launch:Job 启动一个协程但不会阻塞调用线程(CoroutineScope作用域内调用)
  • async:Deferred<T> 启动一个协程但不会阻塞调用线程(CoroutineScope作用域内调用)

协程作用域(CoroutineScope)

GlobalScope 全局顶级协程 (现在 GlobalScope 类已被 @DelicateCoroutinesApi 注解所标记) 全局范围
启动一个协程:

CoroutineScope https://developer.android.com/topic/libraries/architecture/coroutines

MainScope 主线程的作用域,全局范围

lifecycleScope 生命周期范围,用于activity等有生命周期的组件,DESTROYED结束。

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch {
            val params = TextViewCompat.getTextMetricsParams(textView)
            val precomputedText = withContext(Dispatchers.Default) {
                PrecomputedTextCompat.create(longTextContent, params)
            }
            TextViewCompat.setPrecomputedText(textView, precomputedText)
        }
    }
}
 class MyViewModel: ViewModel() {
    init {
        viewModelScope.launch {
            // Coroutine that will be canceled when the ViewModel is cleared.
        }
    }
}
val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

异步、并发、并行

异步

  • 是一种编程模型
  • 独立于主程序流事件的发生
  • 异步启动的操作,不会立即阻塞程序,并同时发生
    异步是实现非阻塞和并发编程的编程模型

并发

  • 独立执行任务的组合
  • 所有任务的工作都可以以某种任意顺序交错
  • 这些任务不一定必须同时执行
    它的主要目标是结构,而不是并行性

并行

  • 同时执行多个事物
  • 与多个任务的执行有关

并发就是一次处理很多事情,并行就是一次做很多事情

协程中的并发和并行

  • 挂起而非阻塞 ,一个并发的例子
import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis
fun main(args: Array<String>) =
    runBlocking {
        val time = measureTimeMillis {
            val one = async { doSomethingUsefulOne() }
            val two = async { doSomethingUsefulTwo() }
            println("The answer is ${one.await()} ${two.await()}")
        }
        println("Completed in $time ms")
    }
suspend fun doSomethingUsefulTwo() :Int{
    delay(1000L)
    println("two")
    return  2
}
suspend fun doSomethingUsefulOne():Int {
    delay(1000L)
    println("one")
    return  1
}

 结果

one
two
The answer is 1 2
Completed in 1020 ms

并行

  • GlobalScope
  • 指定协同调度程序
  • 暂停阻塞
suspend fun doSomethingUsefulOne(): BigInteger = withContext(Dispatchers.Default) {
    measureTimedValue {
        println("in doSomethingUsefulOne")
        BigInteger(1500, Random()).nextProbablePrime()
    }
}.also {
    println("Prime calculation took ${it.duration} ms")
}.value

以上就是Kotlin-Coroutines中的async与await异步协程管理的详细内容,更多关于Kotlin Coroutines异步协程的资料请关注脚本之家其它相关文章!

相关文章

  • Java多线程文件分片下载实现的示例代码

    Java多线程文件分片下载实现的示例代码

    这篇文章主要介绍了Java多线程文件分片下载实现的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java设计模式之备忘录模式

    Java设计模式之备忘录模式

    这篇文章主要介绍了Java设计模式之备忘录模式,备忘录模式(Memento Pattern),属于行为型设计模式,目的是用于保存一个对象在某一时刻的状态,以便于在将来某个时刻根据此状态恢复该对象,需要的朋友可以参考下
    2023-12-12
  • IDEA2022创建Maven Web项目教程(图文)

    IDEA2022创建Maven Web项目教程(图文)

    本文主要介绍了IDEA2022创建Maven Web项目教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java那点儿事之Map集合不为人知的秘密有哪些

    Java那点儿事之Map集合不为人知的秘密有哪些

    Map用于保存具有映射关系的数据,Map集合里保存着两组值,一组用于保存Map的key,另一组保存着Map的value,和查字典类似,通过key找到对应的value,通过页数找到对应的信息。用学生类来说,key相当于学号,value对应name,age,sex等信息。用这种对应关系方便查找
    2021-10-10
  • springboot中引入日志文件生成的配置详解

    springboot中引入日志文件生成的配置详解

    本文主要介绍了springboot中引入日志文件生成的配置详解,包括日志级别的设置、日志格式的配置以及日志输出的位置等,从而帮助开发者更好地进行开发与调试
    2023-10-10
  • java睡眠排序算法示例实现

    java睡眠排序算法示例实现

    这篇文章主要为大家介绍了java睡眠排序算法的示例实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • SpringBoot2整合Redis实现读写操作

    SpringBoot2整合Redis实现读写操作

    Redis,对于大家来说应该不陌生,是经常使用的开发技术之一。本文将结合实例代码,介绍SpringBoot2整合Redis实现读写操作,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java实现验证码验证功能

    Java实现验证码验证功能

    Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢?今天通过本文给大家实例详解,需要的朋友参考下
    2017-02-02
  • Java中深拷贝,浅拷贝与引用拷贝的区别详解

    Java中深拷贝,浅拷贝与引用拷贝的区别详解

    这篇文章主要为大家详细介绍了Java面试中常遇见的问题:深拷贝、浅拷贝与引用拷贝的区别,文中通过示例进行了详细讲解,需要的可以参考一下
    2022-08-08
  • Spring Boot 如何使用Liquibase 进行数据库迁移(操作方法)

    Spring Boot 如何使用Liquibase 进行数据库迁移(操作方法)

    在Spring Boot应用程序中使用Liquibase进行数据库迁移是一种强大的方式来管理数据库模式的变化,本文重点讲解如何在Spring Boot应用程序中使用Liquibase进行数据库迁移,从而更好地管理数据库模式的变化,感兴趣的朋友跟随小编一起看看吧
    2023-09-09

最新评论