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

相关文章

  • MyBatis元素resultMap介绍及使用详解

    MyBatis元素resultMap介绍及使用详解

    这篇文章主要介绍了MyBatis元素resultMap介绍及使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Springboot3.3 整合Cassandra 4.1.5的详细过程

    Springboot3.3 整合Cassandra 4.1.5的详细过程

    这篇文章主要介绍了Springboot3.3 整合Cassandra 4.1.5的详细过程,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Java并发编程之阻塞队列详解

    Java并发编程之阻塞队列详解

    这篇文章主要为大家详细介绍了Java并发编程之阻塞队列,什么是阻塞队列?主要的阻塞队列及其方法介绍,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Jboss Marshalling服务端无法接受消息

    Jboss Marshalling服务端无法接受消息

    这篇文章主要介绍了Jboss Marshalling服务端无法接受消息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • JavaWeb通过IDEA配置Servlet操作流程详解

    JavaWeb通过IDEA配置Servlet操作流程详解

    这篇文章主要介绍了JavaWeb通过IDEA配置Servlet实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • 关于JVM翻越内存管理的墙

    关于JVM翻越内存管理的墙

    这篇文章主要介绍了JVM翻越内存管理的墙,由虚拟机管理内存看起来一切都很美好,但也正是因为把控制内存的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,就不得不从Java虚拟机角度上去排查问题,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 如何解决Maven无法拉取SNAPSHOT依赖问题

    如何解决Maven无法拉取SNAPSHOT依赖问题

    在使用Maven管理项目时,可能会遇到无法拉取SNAPSHOT版本依赖的问题,这通常是因为Maven默认不支持直接拉取SNAPSHOT版本,遇到这样的问题,可以通过在项目的pom.xml文件中添加<repositories>标签,并配置启用SNAPSHOT的仓库地址来解决
    2024-10-10
  • 一定要让你搞懂Java位运算符

    一定要让你搞懂Java位运算符

    这篇文章主要为大家介绍了Java位运算符,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • CorsFilter 过滤器解决跨域的处理

    CorsFilter 过滤器解决跨域的处理

    这篇文章主要介绍了CorsFilter 过滤器解决跨域的处理操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 解决springcloud 配置gateway 出现错误的问题

    解决springcloud 配置gateway 出现错误的问题

    今天给大家分享springcloud 配置gateway 出现错误的问题,其实解决方法很简单,只需要降低springcloud版本,改成Hoxton.SR5就好了,再次改成Hoxton.SR12,也不报错了,下面给大家展示下,感兴趣的朋友一起看看吧
    2021-11-11

最新评论