美文网首页
挂起函数

挂起函数

作者: 莫库施勒 | 来源:发表于2019-05-24 10:50 被阅读0次

async 用于处理挂起函数的并发
在概念上,async 就类似于 launch。它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。不同之处在于 launch 返回一个 Job 并且不附带任何结果值,而 async 返回一个 Deferred —— 一个轻量级的非阻塞 future, 这代表了一个将会在稍后提供结果的 promise。你可以使用 .await() 在一个延期的值上得到它的最终结果, 但是 Deferred 也是一个 Job,所以如果需要的话,你可以取消它。

suspend fun doSomethingUsefulOne(): Int {
    delay(1000L) // 假设我们在这里做了些有用的事
    return 13
}

suspend fun doSomethingUsefulTwo(): Int {
    delay(1000L) // 假设我们在这里也做了一些有用的事
    return 29
}
fun main() = runBlocking<Unit> {
    val time = measureTimeMillis {
        val one = async { doSomethingUsefulOne() }
        val two = async { doSomethingUsefulTwo() }
        println("The answer is ${one.await() + two.await()}")
    }
    println("Completed in $time ms")    
}
val time = measureTimeMillis {
// 当添加了 CoroutineStart.LAZY, 只有被await 或 start 协程才会被调用
    val one = async(start = CoroutineStart.LAZY) { doSomethingUsefulOne() }
    val two = async(start = CoroutineStart.LAZY) { doSomethingUsefulTwo() }
    // 执行一些计算
    one.start() // 启动第一个
    two.start() // 启动第二个
    println("The answer is ${one.await() + two.await()}")
// 注意,这里如果不实用start,消耗的时间仍是两者之和
}

我们可以对这些挂起函数进行封装

// somethingUsefulOneAsync 函数的返回值类型是 Deferred<Int>
fun somethingUsefulOneAsync() = GlobalScope.async {
    doSomethingUsefulOne()
}

// somethingUsefulTwoAsync 函数的返回值类型是 Deferred<Int>
fun somethingUsefulTwoAsync() = GlobalScope.async {
    doSomethingUsefulTwo()
}
// 如果在 concurrentSum 函数内部发生了错误,并且它抛出了一个异常,
// 所有在作用域中启动的协程都将会被取消。
suspend fun concurrentSum(): Int = coroutineScope {
    val one = async { doSomethingUsefulOne() }
    val two = async { doSomethingUsefulTwo() }
    one.await() + two.await()
}

fun main() {
        val time = measureTimeMillis {
            // 我们可以在协程外面启动异步执行
            val one = somethingUsefulOneAsync()
            val two = somethingUsefulTwoAsync()
            // 但是等待结果必须调用其它的挂起或者阻塞
            // 当我们等待结果的时候,这里我们使用 `runBlocking { …… }` 来阻塞主线程
            runBlocking {    
                // 这里,它们就会并发执行
                println("The answer is ${one.await() + two.await()}")
            }
        }
        println("Completed in $time ms")
    }

相关文章

  • 挂起函数

    async 用于处理挂起函数的并发在概念上,async 就类似于 launch。它启动了一个单独的协程,这是一个轻...

  • 组合挂起函数

    “被suspend关键字所修饰的函数叫做挂起函数,挂起函数(suspending function)可以像普通函数...

  • Kotlin - 挂起函数(1)- 简介

    什么是挂起函数 用suspend关键字描述的函数,就是挂起函数,它具备挂起恢复能力。这么简单吗?没错,在Api层面...

  • 【Coroutine 源码】Coroutine 状态机实现源码分

    1. 挂起函数 挂起函数是 Coroutine 实现的核心,当我们在调用挂起函数的时候,需要保证调用点符合下面两种...

  • Kotlin协程挂起函数与全局协程实例分析

    Kotlin协程挂起函数与全局协程实例分析 挂起函数【suspend】 这是因为 delay 是一个特殊的 挂起函...

  • Kotlin挂起函数suspend

    要记着的准则 挂起函数只能用到协程和挂起函数中 挂起函数 如果有返回值(则是最后一行是返回值)

  • 组合挂起函数

    本节介绍了将挂起函数组合的各种方法。 默认顺序调用 假设我们在不同的地方定义了两个进行某种调用远程服务或者进行计算...

  • 组合挂起函数

    挂起函数调用顺序 在协程中顺序调用多个挂起函数 这多个挂起函数执行的顺序和常规代码中一样 默认都是顺序执行的常规代...

  • 6.协程的挂起

    挂起函数的作用以及使用场景:挂起函数会让协程从正在执行它的线程上脱离,并在挂起函数执行结束恢复到原线程,实现非阻塞...

  • 协程--"异步的代码同步化"

    如何理解 "异步的代码同步化"呢? 首先把你的Activiy做为一个协和 一个挂起函数 这个挂起函数 挂起了2秒后...

网友评论

      本文标题:挂起函数

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