美文网首页js css html
Kotlin-Coroutines 中的async与await

Kotlin-Coroutines 中的async与await

作者: ZoranLee | 来源:发表于2022-09-16 17:56 被阅读0次

    Coroutines

    官网说明

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

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

    简单概括 :

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

    协程的创建/启动

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

    协程作用域(CoroutineScope)

    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

        本文链接:https://www.haomeiwen.com/subject/sqafortx.html