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异步协程的资料请关注脚本之家其它相关文章!

相关文章

  • gradle构建工具和java不兼容错误的解决方案

    gradle构建工具和java不兼容错误的解决方案

    这篇文章主要介绍了如何解决AS中Gradle和Java版本不兼容的问题,主要解决方案包括升级Gradle版本或降级Java版本,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • Springboot整合实现邮件发送的原理详解

    Springboot整合实现邮件发送的原理详解

    SpringBoot集成邮件服务非常简单,通过简单的学习即可快速掌握邮件业务类的核心逻辑和企业邮件的日常服务,本文给大家分享Springboot整合实现邮件发送的原理,一起看看吧
    2021-06-06
  • SpringBoot2 集成log4j2日志框架的实现

    SpringBoot2 集成log4j2日志框架的实现

    这篇文章主要介绍了SpringBoot2 集成log4j2日志框架的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • SpringCloud @RefreshScope注解源码层面深入分析

    SpringCloud @RefreshScope注解源码层面深入分析

    @RefreshScope注解能帮助我们做局部的参数刷新,但侵入性较强,需要开发阶段提前预知可能的刷新点,并且该注解底层是依赖于cglib进行代理的,所以不要掉入cglib的坑,出现刷了也不更新情况
    2023-04-04
  • Java动态添加view的方法

    Java动态添加view的方法

    这篇文章主要介绍了Java动态添加view的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • SpringMVC + servlet3.0 文件上传的配置和实现代码

    SpringMVC + servlet3.0 文件上传的配置和实现代码

    本篇文章主要介绍了SpringMVC + servlet3.0 文件上传的配置和实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • mybatis中BigDecimal中的0存为null的坑及解决

    mybatis中BigDecimal中的0存为null的坑及解决

    在使用MyBatis进行数据库操作时,若Java中属性类型为BigDecimal且值为0,插入数据库时可能会变为null,而不是0,这个问题可能是由于MyBatis在处理BigDecimal类型时的弱类型判断导致的,当BigDecimal变量与空字符串进行比较时,MyBatis可能将其视为null
    2024-10-10
  • Mybatisplus实现JSON处理器的示例代码

    Mybatisplus实现JSON处理器的示例代码

    Mybatisplusjson是基于Mybatisplus开发的一个json工具库,本文主要介绍了Mybatisplus实现JSON处理器的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Spring中RedisTemplate使用方法详解

    Spring中RedisTemplate使用方法详解

    Spring封装了一个比较强大的模板,也就是redisTemplate,方便在开发的时候操作Redis缓存,这篇文章主要给大家介绍了关于Java中RedisTemplate使用方法的相关资料,需要的朋友可以参考下
    2023-12-12
  • logback中显示mybatis查询日志文件并写入的方法示例

    logback中显示mybatis查询日志文件并写入的方法示例

    这篇文章主要为大家介绍了logback中显示mybatis查询日志文件并写入的方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论