java await async_通过async与await实现高效并发

本文介绍了Kotlin中协程的超时处理函数`withTimeoutOrNull`,对比了它与`withTimeout`的区别,并展示了如何在超时时避免抛出异常。接着,文章深入探讨了`async`和`await`的使用,解释了它们在并发执行和获取结果上的作用,以及如何通过`async`和`await`改进程序执行效率。
摘要由CSDN通过智能技术生成

withTimeoutOrNull:

在上一次https://www.cnblogs.com/webor2006/p/12010388.html中对于协程的超时机制进行了一个学习,上次用的是withTimeout()函数,还有一个重载这次来看一下:

37a58e1c33314bf2597239a9687c11bc.png

先来说一下它产生的背景,我们知道在上一次用withTimeout()时如果超时了会抛出一个异常:

d6734974e009b357f295a457355682d4.png

该异常是CancellationException的子类,当该异常抛出时,我们并未在控制台上看到整个异常堆栈信息,这是因为在取消的协程当中,CancellationException被认为是一种协程完成的正常原因而已。不过,我们在该示例中,是在main函数中使用了withTimeout函数调用,既然CancellationException仅仅只是个异常而已,所有的资源也都会以通常的方式来关闭,那么我们就可以将相关代码放到一个try...catch块中;此外,Kotlin还提供了另外一个更加友好的函数调用:withTimeoutOrNull;从功能角度来着,它非常类似于withTimeout,不过当超时发生时,它并不会抛出CancellationException异常,而是会直接返回null。

对于withTimeout函数调用来说,如果将其放置到try...catch块中,那么调用形式就是下面这样:

858d85aaca004dacea3f953f7373bc11.png

但是!!如果咱们采用withTimeoutOrNull来使用的话,其形式就会变成这样:

821d0ac3c7af4039308d4bbaebaf1b26.png

那如果改为正常执行呢?

3cac7f5c3597f0687076a8e214f6aa9a.png

至此对于协程的超时机制就学习完了。

async与await:

接下来学习一个全新的知识点,关于它貌似前阵在学习小程序的开发中也看到过,当时看着也是感觉挺陌生的一个写法,不过当时是在JS中的代码,这里是在Kotlin语言中,那接下来好好学学它,也有助于微信开发的这块用法的理解,下面先从一个挂起函数的组合使用开始:

be5682e55b17311d114b68016c202317.png

接下来则将2个挂起函数的值进行累加并打印,而且还打印一下调用这俩挂起函数的消耗总时间,这里有个小细节说明一下:说到函数的执行时间的打印可能通常的做法是这样:

1e40f3a06f148391bc57b51c5b545a5e.png

但是Kotlin为咱们提供了一个这种功能的现有函数,不用咱们自己来手动写了,如下:

ae9b24ff509f025682a77247a63203f7.png

这个程序比较好理解,也很自然,这里来分析一下这种传统写法的弊端:

21023980e63ac00a4aa25ea987893a72.png

此时,async与await的使用场景就出来了,下面先对其理论进行了解:

从概念上来说,async就像是launch一样,它会开启一个单独的协程,这个协程是个轻量级线程,可以与其他协程并发工作。区别在于,launch会返回一个Job,但是Job并不会持有任何结果值,而async会返回一个Deferred,这是一个轻量级的非阻塞的future,它代表一个promise,可以在稍后提供一个结果值。

可以通过在一个deferred值上调用.await()方法来获取最终的结果值,Deferred也是个Job,因此可以在需要时对其进行取消。

好,先来看一下Deferred这个跟Job是啥关系:

4f9c2a0b0c8329c4ce87b296cc0a6543.png

41f8c3a844765443661ece230390e2ad.png

所以说Deferred就是一个Job,好,下面咱们来改造一下程序,看是否能缩短执行时间:

3353c2d4c18cb2cbf20d1fd6243a5ffa.png

其中可以看到async是一个扩展函数:

e680cf6855dceb973a1707729b1a2f0d.png

而await()是Deferred中定义的,如下:

31197709e40503f81c78f33dbce43745.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值