【Kotlin】协程(三)

文章介绍了如何使用Kotlin的协程来实现同步方式写异步代码,通过async和await简化并发操作,提高程序运行效率。对比传统的同步方法,协程避免了回调地狱,并通过示例展示了使用measureTimeMillis测量异步执行时间,证明了协程在处理网络请求和数据库操作时的性能优势。
摘要由CSDN通过智能技术生成

3.1 同步方式写异步代码

话不多说,我们先看下面的代码

suspend fun doPartOne() : String{
    println("time 1 : "+System.currentTimeMillis())
    delay(100L)
    return "part-one"
}

suspend fun doPartTwo() : String{
    println("time 2 : "+System.currentTimeMillis())
    delay(200L)
    return "part-two"
}

fun main() = runBlocking{
    val one = doPartOne()
    val two = doPartTwo()

    println( "we have done ${one} and ${two}")
}

我们定义两个挂起函数,分别延迟 100和 200ms输出不同的部分,然后main方法,通过 runBlocking 方式调用两个方法,最后输出结果。

同步

按照上面的输出可以看出partoneparttwo是按照顺序执行的,当两者没有必然联系的时候,如果能够并发的返回,提升运行速率是不是更好呢,没错,Kotlin 为我们提供了async 和 await。

我们先看看上面的方法改造后是什么样子,这里仅改写 main 方法

fun main() = runBlocking {
    val one = async { doPartOne() }
    val two = async { doPartTwo() }

    println("we have done ${one.await()} and ${two.await()}")
}

与上面代码不同的地方,仅仅是使用 async 包裹了两个要执行的方法,同时在获取 value 的地方使用 await 方法,这里的 async 相当于创建了一个子协程,类似 launch,和 launch 不同的是,async 返回的是一个 Deferred 对象,这个对象是一个非阻塞的 future,是一个带有结果的 job。而 launch 返回的 job 是没有结果的。而在输出语句中,使用的 await 方法就会在此处等待 future 的返回结果,并且获取结果。

到这里也许有人会提出,这两到底有啥差异啊,看着也都差不多。确实,这两写法学时很类似,无非就是一层 async 区别。可别小看了这个东西,下面我们使用measureTimeMillis来打印一下 main 方法内部执行的时间

fun main() = runBlocking {
    val  time = measureTimeMillis {
        val one = async { doPartOne() }
        val two = async { doPartTwo() }

        println("we have done ${one.await()} and ${two.await()}")
    }

    println("cost time : ${time}")
}

异步

对比第一次的输出结果,这里的第二个方法紧接着第一个方法就执行了。总得耗时也就 225ms,按照第一次的写法,耗时最少也要 300ms,如果换做一个网络请求,或者是数据库的操作,这里的耗时差距可能回更加的明显。

从这里来看,Kotlin 中的异步代码在协程同步方式的写法,是更加高效,而且便于理解。传统 Java 中的网络请求还会有这大量的回调方法,在协程中这种回调地狱就变得更加好处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

0neXiao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值