CoroutineScope launch等待await异步协程async结果返回,Kotlin

CoroutineScope launch等待await异步协程async结果返回,Kotlin

 

 

import kotlinx.coroutines.*

fun main(args: Array<String>) {
    runBlocking {
        println("async ...")
        val task = async(context = Dispatchers.IO, start = CoroutineStart.LAZY) {
            println("async delay... ${System.currentTimeMillis()}")
            delay(3000)
            println("async delay end ${System.currentTimeMillis()}")

            "zhangphil"
        }
        println("async end")

        println("launch ...")
        CoroutineScope(Dispatchers.IO).launch {
            println("launch await ...")
            val r = task.await()
            println("launch await : $r ${System.currentTimeMillis()}")
        }
        println("launch end")
    }
}

 

 

async ...
async end
launch ...
launch end
launch await ...
async delay... 1703750881366
async delay end 1703750884380
launch await : zhangphil 1703750884381

 

 

 

Kotlin协程CoroutineScope异步async取消cancel等待await的任务_kotlin coroutine await-优快云博客文章浏览阅读148次。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。_kotlin协程 串行。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。_kotlin coroutine awaithttps://blog.youkuaiyun.com/zhangphil/article/details/132621143

kotlin用CoroutineScope启动协程async等待结果返回_kotlin协程等待另一个线程结果-优快云博客文章浏览阅读1k次。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。_kotlin协程等待另一个线程结果https://blog.youkuaiyun.com/zhangphil/article/details/129270875kotlin协程async与await_安卓协程await-优快云博客文章浏览阅读574次。runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。结果1-b: 5 - tid:24。结果2-a: 9 - tid:22。_安卓协程awaithttps://blog.youkuaiyun.com/zhangphil/article/details/129268399

 

Kotlin 协程中,`async` 和 `launch` 是两种常见的协程构建器,它们在 IO 调度器(`Dispatchers.IO`)中的使用方式和语义有所不同,适用于不同的并发场景。 ### 用途与返回值差异 `launch` 用于启动一个新的协程,它不返回结果,仅用于执行副作用操作,例如发起网络请求、写入数据库等。它适合用于不需要返回值的任务,通常用于执行一段独立的逻辑流程。例如: ```kotlin CoroutineScope(Dispatchers.IO).launch { // 执行网络请求或数据库操作 } ``` 而 `async` 则用于启动一个协程返回一个 `Deferred` 对象,该对象可以用于获取协程执行结果。它适合用于需要并行执行多个任务并最终合并结果的场景。例如: ```kotlin val deferred1 = CoroutineScope(Dispatchers.IO).async { // 执行一个网络请求 } val deferred2 = CoroutineScope(Dispatchers.IO).async { // 执行另一个网络请求 } val result = deferred1.await() + deferred2.await() ``` ### 并发与错误处理机制 当多个任务可以并行执行时,使用 `async` 可以更高效地利用资源,因为每个 `async` 启动的协程可以独立执行并最终通过 `await()` 获取结果。如果其中一个 `async` 协程抛出异常,则该异常会被封装在对应的 `Deferred` 对象中,并在调用 `await()` 时重新抛出。 而 `launch` 启动的协程如果抛出异常,默认情况下会导致整个协程作用域(`CoroutineScope`)失败,并取消所有子协程。因此,在使用 `launch` 时需要特别注意异常处理策略,通常结合 `try...catch` 或者使用 `CoroutineExceptionHandler` 来管理错误传播。 ### 性能与调度策略 在 `Dispatchers.IO` 上,`async` 和 `launch` 都会被调度到后台线程池中执行,适用于 I/O 密集型任务,如网络请求、文件读写等。它们在调度层面没有本质区别,但语义上的不同会影响任务的组合方式和并发模型。 在实际开发中,推荐使用 `launch` 来启动没有返回值的任务,而需要返回结果的任务则使用 `async`,尤其是在需要组合多个异步操作结果的场景下,`async` 的优势更为明显。 ### 示例代码 以下是一个使用 `async` 并行获取两个网络资源的示例: ```kotlin CoroutineScope(Dispatchers.IO).launch { val result1 = async { fetchDataFromApi1() } val result2 = async { fetchDataFromApi2() } val combined = result1.await() + result2.await() // 处理合并后的数据 } ``` 上述代码展示了如何利用 `async` 并行执行两个网络请求,并通过 `await()` 等待它们的结果后进行合并处理。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值