首页 > 其他分享 >协程的async使用

协程的async使用

时间:2022-11-03 20:35:49浏览次数:40  
标签:async2 async1 协程 sum await 使用 async GlobalScope

async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job

 

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

 

看一下async的使用:

GlobalScope.launch {
    var deffer1 = async(Dispatchers.IO) {
        async1()
    }.await()
    var deffer2 = async(Dispatchers.IO) {
        async2()
    }.await()
    val result = deffer1 + deffer2
    println("the sum is: $result")
}

private suspend fun async1(): Int {
    delay(1500)
    println("async1")
    return 1
}
private suspend fun async2(): Int {
    delay(300)
    println("async2")
    return 2
}

最终输出:

I/System.out: async1 
I/System.out: async2
I/System.out: the sum is: 3

async1先执行,说明其是顺序进行的,因为await本身就是一个挂起行数,这时候它的用法与withContext没有什么差别。

 

再看一个例子:

GlobalScope.launch {
    var deffer1 = async(Dispatchers.IO) {
        async1()
    }
    var deffer2 = async(Dispatchers.IO) {
        async2()
    }
    Log.d("GlobalScope","before sum")
    var r1 = deffer1.await()
    var r2 = deffer2.await()
    val result = r1 + r2
    Log.d("GlobalScope","the sum is -> $result")
}

private suspend fun async1(): Int {
    delay(1500)
    Log.d("GlobalScope","async1")
    return 1
}
private suspend fun async2(): Int {
    delay(300)
    Log.d("GlobalScope","async2")
    return 2
}

打印log:

D/GlobalScope: before sum
D/GlobalScope: async2
D/GlobalScope: async1
D/GlobalScope: the sum is -> 3

可以看到async2先执行,因为挂起函数在后面,await是挂起函数。

 

简化写法:

GlobalScope.launch {
    var deffer1 = async(Dispatchers.IO) {
        async1()
    }
    var deffer2 = async(Dispatchers.IO) {
        async2()
    }
    Log.d("GlobalScope","before sum")
    val result = deffer1.await() + deffer2.await()
    Log.d("GlobalScope","the sum is -> $result")
}

打印log:

D/GlobalScope: before sum
D/GlobalScope: async2
D/GlobalScope: async1
D/GlobalScope: the sum is -> 3

 

标签:async2,async1,协程,sum,await,使用,async,GlobalScope
From: https://www.cnblogs.com/tangZH/p/16853978.html

相关文章

  • oracle 存储过程使用
    创建存储过程createprocedureWMSendObj(orginvarchar2,deptinvarchar2)ascursorcurssis(selectdistinctcnofromHR_ARC_DISPAT......
  • 使用Wireshark完成实验3-IP
    1、使用Wireshark打开ip-ethereal-trace-1,如图 电脑IP地址为192.168.1.1022、如图,IP包头中上层协议字段的值为1,代表为ICMP 3、如图,IP头中有20字节  IP数据......
  • 使用注解实现加解密方式
    /***对象隐私数据加解密工具类.**@authord*@since2018年05月22日*/publicfinalclassPrivacyDataHandler{privatestaticConcurrentHashMap<Str......
  • 使用templates模版
    Django         2.1.10  'DIRS':[os.path.join(BASE_DIR,'templates')],#修改位置......
  • 如何登录微软网站,以使用Microsoft WhiteBoard?
    Windows10登录微软账户为什么一直显示请稍等步骤:修改\(DNS:4.2.2.2\)和\(4.2.2.1\)是微软的免费\(dns\)服务器地址*关闭\(IPV6:\)......
  • stringBuffer的使用
    packagecom.te.jdkapi;publicclassTestString{publicstaticvoidmain(String[]args){test();test2();}publicstaticvoidte......
  • iconfont的使用
    选择自己喜欢的icon图标,添加图库到项目生成链接(Fontclass)复制后的代码添加到public文件夹下面的index.html 例:<linkrel="stylesheet"href="https://at.alicdn.......
  • NCF(NeuCharFramework)框架的使用 当前所用框架版本(0.3.1-beta3)
    1、官网介绍:NCF-NeuCharFramework|NCF文档2、下载NCF框架代码:https://github.com/NeuCharFramework/NCF3、运行NCF框架用vs2022打开下载的NCF项目NCF\src\back-en......
  • Redis Desktop Manager(Redis可视化工具)安装及使用教程
    1、https://blog.csdn.net/m0_55070913/article/details/123677891RedisDesktopManager(Redis可视化工具)安装及使用教程2、一、工具/材料官网下载:https://redisdesk......
  • spdk基础使用
    准备环境为nvme设备/dev/nvme0n1创建文件系统mkfs.ext4/dev/nvme0n1不能直接挂载块设备文件,要先格式化文件系统2.挂载mount/dev/nvme0n1/home/msk/nvmeext4......